如何解决使用JSON.parse之前应如何清除不受信任的JSON? ...应始终对来自用户的数据进行过滤和清理
给定用户提供的JSON字符串,我们如何在运行JSON.parse(untrustedString)
之前 清理它?
我最关心的是原型污染,但我也想知道我还应该注意什么?如果只是原型污染是有风险的,那么我认为可以通过正则表达式来解决,但我怀疑还有其他担忧吗?
例如this article on the dangers of parsing untrusted JSON and then creating a copy of the object.:
现在考虑一些发送到该端点的恶意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));
,
在执行任何操作之前,userString
只是 一个字符串,并且该字符串中的任何内容本身都不会损害系统,除非系统采取了一些措施以免造成损害,例如以不安全的方式进行处理。
输入JSON.parse()
。JSON.parse()
只是一种格式转换工具。它不会从数据中运行任何方法(原始污染漏洞所依赖),甚至不会看查看字符串对象本身中包含的数据(超出structural syntax it contains且保留了JavaScript)字,用于验证(MDN polyfill example)。这里的原理与字符串相同。如果您不对输出对象执行任何不安全的操作,则不会伤害您或您的系统。
最后,防止滥用的解决方案只是验证和安全的数据处理做法。
检查由解析字符串产生的对象,并在严格的参数范围内对其进行验证,而忽略原型突变。
使用Object.prototype.hasOwnProperty.call()
。
使用eslint(no-prototype-builtins rule)之类的工具在您的代码库中强制实施这些做法。
不要指望用户发送完美,安全的数据。
在article you linked中,作者提到了这个确切的想法:
...应始终对来自用户的数据进行过滤和清理。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。