知识卡片

安全子集用静态分析加运行时兜底隔离不可信代码

专业/工作 · 419

内容

在页面里安全运行第三方不可信JavaScript代码(如广告、第三方模块),核心思路是先划定一个”安全子集”,禁掉一切能逃逸沙箱、触达全局环境的语言能力:eval()和Function()构造函数因为能执行任意动态代码而被完全封杀;this被禁用是因为非严格模式下裸调用的this指向全局对象,等于留了一扇后门;with语句因为让属性访问的静态分析变得不可判定而被排除。真正棘手的是方括号属性访问o[expr]——点号访问o.prop可以被静态分析出访问的是哪个具体属性从而拦截敏感属性,但方括号里的表达式在编译期算不出来,所以安全子集要么直接禁用方括号,要么把它统一转换成一个运行时检查函数调用,把原本编译期做不到的检查挪到运行期兜底。这套”能静态挡的静态挡,挡不住的转换成运行时检查”的分层策略,是设计任何语言级沙箱都要面对的通用取舍。

参考来源

《JavaScript权威指南(原书第6版)》第11章《JavaScript的子集和扩展》