为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

尚方宝剑之说 2023-03-10 14:54:34
给定一个用户提供的 JSON 字符串,我们如何在运行之前JSON.parse(untrustedString)对其进行清理?我主要担心的是原型污染,但我也想知道我还应该注意什么?如果只是原型污染有风险,那么我认为可以通过正则表达式处理,但我怀疑还有其他问题?例如,这篇关于解析不受信任的 JSON 然后创建对象副本的危险的文章。:现在考虑发送到此端点的一些恶意 JSON 数据。{  "user": {    "__proto__": {      "admin": true    }  }} 如果发送此 JSON,JSON.parse将生成一个具有属性的对象 __proto__。如果复制库按上述方式工作,它将把 admin 属性复制到 req.session.user!
查看完整描述

2 回答

?
萧十郎

TA贡献1815条经验 获得超13个赞

我主要担心的是原型污染

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


查看完整回答
反对 回复 2023-03-10
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

在你对它做任何事情之前,userString它只是一个字符串,并且该字符串中的任何内容本身都不会损害系统,除非系统做一些事情来允许这种损害,比如以不安全的方式处理它。

输入JSON.parse()

JSON.parse()只是一个格式转换工具。它不会从数据中运行任何方法(原型污染利用依赖于它),或者实际上什至查看包含在字符串化对象本身中的数据,除了它包含的结构语法和 JavaScript 保留字,用于验证目的(MDN polyfill例子)。与字符串相同的原则适用于此;如果您不对输出对象做任何不安全的事情,它就不会伤害您或您的系统。

归根结底,防止滥用归结为验证安全数据处理实践

您链接的文章中,作者提到了这个确切的想法:

...来自用户的数据应始终进行过滤和清理。


查看完整回答
反对 回复 2023-03-10
  • 2 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信