【问题标题】:How should untrusted JSON be sanitized before using JSON.parse?在使用 JSON.parse 之前应该如何清理不受信任的 JSON?
【发布时间】:2021-01-03 16:13:09
【问题描述】:

给定一个用户提供的 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__ 财产。如果复制库按上述方式工作, 它将管理属性复制到原型上 req.session.user!

【问题讨论】:

  • json 应该几乎总是可以安全解析。
  • 这是我最初的印象,但我越读越偏执。 JSON.parse()不能允许污染对象原型吗?
  • 我不认为它可以 - 但它可能会创建一个格式错误的对象
  • 我在问题文本中添加了一篇文章,其中包含我关注的一个问题的示例。
  • 啊,这只是说可以通过__proto__ 获得其他属性,您应该提防这种情况 - JSON.parse 没有做错...

标签: javascript json security parsing sanitization


【解决方案1】:

我最关心的是原型污染

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

【讨论】:

    【解决方案2】:

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

    输入JSON.parse()

    JSON.parse() 只是一个格式转换工具。除了structural syntax it contains 和 JavaScript 保留字之外,它不会从数据中运行任何方法(proto 污染漏洞利用所依赖的),甚至不会查看字符串化对象本身中包含的数据,用于验证目的 (MDN polyfill example)。与字符串相同的原理在这里适用;如果你不对输出对象做任何不安全的事情,它就不会伤害你或你的系统。

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

    article you linked,作者提到了这个确切的想法:

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

    【讨论】:

    • “数据总是无害的;当输入奇怪的输入时,准备不足的代码会做坏事”是不言而喻的。尽管如此,安全总比后悔好,并且在这里也进行纵深防御(尽早并经常进行消毒)。所以使用上面@trincot 概述的cleaner 是个好主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多