首页 > 解决方案 > 在使用 JSON.parse 之前应该如何清理不受信任的 JSON?

问题描述

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

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

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

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

{
  "user": {
    "__proto__": {
      "admin": true
    }
  }
} 

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

标签: javascriptjsonsecurityparsingsanitization

解决方案


我最关心的是原型污染

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


推荐阅读