跳到内容

原型链污染预防速查表

解释

原型链污染是一种严重漏洞,攻击者可以操纵应用程序的 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此评论中提供了原始的保护指南。