标准答案

  1. 拒绝或安全处理 __proto__、constructor、prototype 等危险键,不能盲目递归合并用户对象。
  2. 对配置、权限和查询条件使用明确 schema 校验和允许字段,而不是任意对象展开。
  3. 避免用用户输入作为原型链查找的安全判断,必要时使用 Object.create(null) 或 Map。
  4. 依赖库也要及时升级并做供应链审计,运行时防护不能代替输入边界。

题目解析

原型污染的危险在于不可信键改变对象继承属性,后续配置、权限、模板或命令逻辑可能把被污染属性当成默认值。影响范围取决于合并路径和后续使用,不应只看是否出现 __proto__。

输入应通过 schema 和允许字段校验,拒绝 constructor、prototype 等危险路径,配置和权限对象最好使用明确类型而不是任意递归 merge。Object.create(null) 或 Map 可以减少原型链参与,但仍要做业务校验。

库升级和供应链审计很重要,运行时过滤不能替代依赖修复。测试要覆盖嵌套对象、数组、合并、序列化和权限判断,确认污染不会进入其他请求。

常见误区

  • 误区:只过滤一个字符串。改正:使用 schema/白名单拒绝危险键和嵌套路径,覆盖所有 merge 入口。
  • 误区:用 Object.assign 合并任意请求体。改正:只复制允许字段,并为配置和权限对象使用受控结构。
  • 误区:直接调用不可信对象的 hasOwnProperty。改正:使用 Object.prototype.hasOwnProperty.call 或安全数据结构。

作者信息