原型链污染预防速查表¶
解释¶
原型链污染是一种严重漏洞,攻击者可以操纵应用程序的 JavaScript 对象和属性,从而导致严重的安全问题,例如未经授权的数据访问、权限提升,甚至远程代码执行。
有关此漏洞为何危险的示例,请参阅下方“其他资源”部分中的链接。
建议的保护机制¶
使用 "new Set()" 或 "new Map()"¶
开发人员应使用 new Set()
或 new Map()
,而不是使用对象字面量。
let allowedTags = new Set();
allowedTags.add('b');
if(allowedTags.has('b')){
//...
}
let options = new Map();
options.set('spaces', 1);
let spaces = options.get('spaces')
如果需要对象或对象字面量¶
如果必须使用对象,则应使用 Object.create(null)
API 创建它们,以确保它们不继承自 Object 原型。
let obj = Object.create(null);
如果需要对象字面量,作为最后的手段,可以使用 __proto__
属性。
let obj = {__proto__:null};
使用对象 "freeze" 和 "seal" 机制¶
您还可以使用 Object.freeze()
和 Object.seal()
API 来防止内置原型被修改,但这可能会破坏应用程序(如果其使用的库修改了内置原型)。
Node.js 配置标志¶
Node.js 还提供了使用 --disable-proto=delete
标志完全移除 __proto__
属性的功能。请注意,这是一种深度防御措施。
使用 constructor.prototype
属性仍然可能发生原型链污染,但移除 __proto__
有助于减少攻击面并防止某些攻击。
其他资源¶
鸣谢¶
感谢 Gareth Hayes 在此评论中提供了原始的保护指南。