JavaScript箭头函数能否规避Function原型污染风险?
箭头函数能否规避原型污染及执行篡改风险?
首先明确:箭头函数没有自己的prototype属性,这是ES6标准明确规定的,所有主流JavaScript引擎的实现都遵循这一点,你可以直接验证:
const arrowFn = () => {}; console.log(arrowFn.prototype); // 输出 undefined
但只靠箭头函数,没法完全解决你关心的原型污染、执行篡改问题,原因如下:
- 箭头函数依然会继承
Function.prototype和Object.prototype的属性。如果这两个内置原型被污染(比如有人给Function.prototype加了恶意的call方法,或者改了Object.prototype.toString),箭头函数调用时还是会触发这些被篡改的属性; - 要是全局环境被劫持(比如用
Proxy包装了全局对象),箭头函数内部访问的全局变量依然可能被篡改; - 箭头函数的
this是词法绑定的,但如果外层作用域的this被篡改,照样会影响内部逻辑。
如果你的目标是让关键逻辑完全不受篡改、注入影响,仅用箭头函数不够,得配合这些方案:
- 把关键逻辑放进独立封闭的作用域,比如用立即执行函数表达式(IIFE)创建私有环境,在内部定义所有需要的变量和工具函数,不依赖全局原型;
- 提前快照原生方法,比如把
const nativeCall = Function.prototype.call存在私有作用域里,关键逻辑里直接用这个快照,不用全局的call; - 尽量用原生语法替代原型方法,比如把
array.forEach(...)改成for (let i = 0; i < array.length; i++),避免依赖被污染的数组原型方法。
内容的提问来源于stack exchange,提问作者Cocktail
相关产品推荐
相关产品推荐

