Slb*_*box 6 javascript security parsing json sanitization
给定用户提供的 JSON 字符串,我们如何在运行之前JSON.parse(untrustedString)对其进行清理?
我主要担心的是原型污染,但我也想知道我还应该注意什么?如果只是原型污染存在风险,那么我认为可以通过正则表达式来处理,但我怀疑还有其他问题吗?
例如,这篇文章介绍了解析不受信任的 JSON 然后创建对象副本的危险。:
现在考虑发送到此端点的一些恶意 JSON 数据。
Run Code Online (Sandbox Code Playgroud){ "user": { "__proto__": { "admin": true } } }如果发送此 JSON,
JSON.parse将生成一个具有属性的对象__proto__。如果复制库按上述方式工作,它将把 admin 属性复制到req.session.user!的原型上。
我主要担心的是原型污染
注意JSON.parse不会污染任何原型对象。如果 JSON 字符串有一个"__proto__"键,那么该键将像任何其他键一样被创建,并且无论该 JSON 中对应的值是什么,它最终都将作为该属性值,而不是在原型对象 ( Object.prototype) 中。
风险在于您事后如何处理该对象。如果您使用属性分配或执行(深层)复制Object.assign,则可能会改变原型对象。
跑步前我们如何对其进行消毒
JSON.parse(untrustedString)?...我认为可以通过正则表达式处理
不要为此使用正则表达式。使用第二个参数JSON.parse:
const cleaner = (key, value) => key === "__proto__" ? undefined : value;
// demo
let json = '{"user":{"__proto__":{"admin": true}}}';
console.log(JSON.parse(json));
console.log(JSON.parse(json, cleaner));Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6636 次 |
| 最近记录: |