javascript - 在使用 JSON.parse 之前应该如何清理不受信任的 JSON?
问题描述
给定一个用户提供的 JSON 字符串,我们如何在运行之前JSON.parse(untrustedString)
对其进行清理?
我主要关心的是原型污染,但我也想知道我还应该注意什么?如果只是原型污染有风险,那么我认为可以通过正则表达式处理,但我怀疑还有其他问题?
例如,这篇关于解析不受信任的 JSON 然后创建对象副本的危险的文章。:
现在考虑一些发送到此端点的恶意 JSON 数据。
{ "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));
推荐阅读
- sql - 具有唯一且不为空的字段
- javascript - 隐藏一个 Div 直到被点击,而不是再次隐藏一次再次点击
- directory - 为什么 Microsoft Windows 10 文件资源管理器会不断将文件夹的权限更改回“只读”,即使我应该拥有完全控制权?
- python-3.x - python函数返回不带扩展名的文件名元组和字典,其中文件扩展名是键,文件名是值
- flutter - 多次调用 TabController 侦听器。indexIsChanging 是如何工作的?
- if-statement - 空气桌公式
- z3 - 如何检查 1000 多个没有重复值的变量?
- c++ - mysql C++ 连接器 [mysql-connector-c++-8.0.19-linux-glibc2.12-x86-64bit]
- openpyxl - Openpyxl:在图表中使用 excel 主题颜色
- node.js - 使用 Mongoose 在子文档中填充 1 个以上的属性