结论:原型污染源于把用户输入递归合并进对象,攻击者通过 __proto__ 等键改写 Object 原型,影响全进程。
①常见入口是 lodash.merge、Object.assign 的深拷贝封装、以及自己写的递归 merge 函数,凡是遍历键名直接赋值的都要警惕。
②合并前过滤 __proto__、constructor、prototype 这三个键,或者用 Object.create(null) 创建无原型对象承接数据。
③升级 lodash 等已知受影响的库到修复版本,老项目重点排查。
④用 JSON Schema 或白名单校验请求体结构,只接收预期字段,多余字段直接丢弃。
⑤在进程启动时冻结关键原型(Object.freeze(Object.prototype))作为兜底,能挡住大部分改写尝试。