在使用 JSON.parse 之前应如何清理不受信任的 JSON?

Slb*_*box 6 javascript security parsing json sanitization

给定用户提供的 JSON 字符串,我们如何在运行之前JSON.parse(untrustedString)对其进行清理?

我主要担心的是原型污染,但我也想知道我还应该注意什么?如果只是原型污染存在风险,那么我认为可以通过正则表达式来处理,但我怀疑还有其他问题吗?

例如,这篇文章介绍了解析不受信任的 JSON 然后创建对象副本的危险。:

现在考虑发送到此端点的一些恶意 JSON 数据。

{
  "user": {
    "__proto__": {
      "admin": true
    }
  }
} 
Run Code Online (Sandbox Code Playgroud)

如果发送此 JSON,JSON.parse将生成一个具有属性的对象 __proto__。如果复制库按上述方式工作,它将把 admin 属性复制到 req.session.user!的原型上。

tri*_*cot 8

我主要担心的是原型污染

注意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)