原型污染防护需在输入层递归清洗敏感键名,立即执行JSON.parse后扫描移除__proto__等危险字段,优先使用Object.create(null),避免高危合并函数,并辅以运行时加固。

原型污染不是靠“小心点”就能防住的,关键是在数据刚进来时就掐断污染路径。它不依赖复杂漏洞利用,一条带 __proto__ 的 JSON 就可能让整个应用的对象都带上恶意属性。
输入层必须递归清洗敏感键名
所有外部输入——JSON 请求体、URL 参数、文件内容——解析后第一件事就是扫描并移除危险字段。不能只查顶层 key,攻击者常用嵌套路径绕过,比如 {"a": {"__proto__": {"x": 1}}} 或 {"x.__proto__.y": "z"}。
- 用正则
/\b(__proto__|constructor|prototype)\b/i对每个键名和完整路径字符串做匹配 - 清洗动作必须放在
JSON.parse()后立即执行,不能等到合并或赋值环节 - 避免写
if (key === '__proto__') continue这类仅检查字面量的逻辑,它对变形写法完全无效
优先用 Object.create(null) 替代 {}
当你只需要一个纯键值容器(比如路由参数映射、插件注册表、配置缓存),就别再用 {}。它自带 Object.prototype,是污染的温床。
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
-
Object.create(null)创建的对象没有__proto__,也不继承toString、hasOwnProperty等方法,天然免疫污染 - 调用原生方法需显式借用:
Object.prototype.hasOwnProperty.call(obj, key) - 注意
obj instanceof Object会返回false,但这类判断本就不该用于数据容器场景
避开高危对象操作函数
很多合并/深拷贝工具默认不校验原型键,_.merge、_.set、_.defaultsDeep 都曾是真实漏洞入口。
立即学习“Java免费学习笔记(深入)”;
- 浅拷贝优先用
Object.assign({}, input)—— 它不递归,天然跳过污染路径 - 需要深拷贝时,现代环境首选
structuredClone();Node.js 可加启动参数--disable-proto=throw - 若必须用 Lodash,版本必须 ≥ 4.17.21;低于此版本即使打过补丁也存在绕过风险
运行时加固作为兜底手段
静态防御可能被新攻击变体绕过,高安全要求场景建议加一层动态防护。
- 服务启动时执行
Object.freeze(Object.prototype),阻止新增/修改属性(注意:不可逆,需确认无合法库依赖) - 预发环境主动注入测试 payload:
{"__proto__": {"polluted": true}},随后验证({}).polluted是否为undefined - 在
req.body、JSON.parse等入口添加日志扫描,命中敏感键立即告警并记录上下文

















