【问题标题】:Is sanitizing JSON necessary?有必要清理 JSON 吗?
【发布时间】:2014-11-16 22:49:27
【问题描述】:

我认为不信任任何输入是网络上众所周知的最佳做法。句子

“所有输入都是邪恶的。”

可能是关于输入验证的引用最多的引用。现在,对于 HTML,您可以使用 DOMPurify 等工具对其进行清理。

我的问题是,如果我有一个运行 Express 和 body-parser 中间件来接收和解析 JSON 的 Node.js 服务器,我是否还需要运行任何清理程序?

我(也许是天真?)对此的想法是 JSON 只是数据,没有代码,如果有人发送无效的 JSON,body-parser(内部使用 JSON.parse())无论如何都会失败,所以我知道我的应用程序将收到一个有效的 JavaScript 对象。只要我不对其运行 eval 或调用函数,我应该没问题,不是吗?

我错过了什么吗?

【问题讨论】:

  • 在我看来,body-parser 已经在清理输入,因此您不需要自己这样做。另一方面,对输入进行双重清理并没有什么害处,除非它是性能瓶颈。

标签: javascript node.js json sanitization dompurify


【解决方案1】:

你应该没事的。 JSON 的早期用户通常会在收到的字符串上调用eval(),这当然是一个巨大的安全漏洞。但是,正如您所说,JSON.parse 处理了大多数此类健全性检查。

例如,只要确保不从接收到的 JSON 对象中取出某些内容并将其直接传递到 SQL 查询中,就可以了。

【讨论】:

  • 不将接收到的 JSON 中的某些内容直接传递到 SQL 查询中的提示特别有价值,谢谢 :-)!
【解决方案2】:

由于JSON.parse() 不会在要解析的数据中运行任何代码,因此它不像eval() 那样容易受到攻击,但是您仍然应该采取一些措施来保护服务器和应用程序的完整性,例如:

  1. 在适当的位置应用异常处理程序,因为JSON.parse() 可以引发异常。
  2. 不要假设存在哪些数据,您必须在使用前明确测试数据。
  3. 仅处理您专门寻找的属性(避免可能在 JSON 中的其他内容)。
  4. 将所有传入数据验证为合法、可接受的值。
  5. 清理数据长度(以防止 DOS 问题与过大的数据)。
  6. 请勿将这些传入数据放入可以进一步评估的位置,例如直接放入页面的 HTML 或直接注入到 SQL 语句中,而无需进一步清理以确保它在该环境中是安全的。

所以,要直接回答您的问题,“是的”除了使用 body-parser 之外,还有更多工作要做,尽管它是第一次处理数据的完美前线。从 body-parser 获取数据后,下一步如何处理数据在许多情况下都很重要,并且可能需要格外小心。


例如,下面是一个解析函数,它需要一个具有属性的对象,该属性应用其中一些检查,并为您提供仅包含您期望的属性的过滤结果:

// pass expected list of properties and optional maxLen
// returns obj or null
function safeJSONParse(str, propArray, maxLen) {
    var parsedObj, safeObj = {};
    try {
        if (maxLen && str.length > maxLen) {
            return null;
        } else {
            parsedObj = JSON.parse(str);
            if (typeof parsedObj !== "object" || Array.isArray(parsedObj)) {
                safeObj = parseObj;
            } else {
                // copy only expected properties to the safeObj
                propArray.forEach(function(prop) {
                    if (parsedObj.hasOwnProperty(prop)) {
                        safeObj[prop] = parseObj[prop];
                    }
                });
            }
            return safeObj;
        }
    } catch(e) {
        return null;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 2016-10-03
    • 2012-12-14
    • 1970-01-01
    相关资源
    最近更新 更多