是否需要消毒JSON?

Gol*_*den 19 javascript json sanitization node.js dompurify

我认为网络上的一个众所周知的最佳做法是不信任任何输入.这句话

"所有的投入都是邪恶的."

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

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

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

我错过了什么吗?

jfr*_*d00 20

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

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

因此,要直接回答您的问题,"是"除了使用正文解析器之外还有更多工作要做,尽管它是第一次处理数据时非常精细的前线.从身体解析器获取数据后,您对数据执行的后续步骤在许多情况下都很重要,可能需要额外注意.


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

// 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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*res 5

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

例如,只要你确保不要从收到的JSON对象中取出一些内容并将其直接传递给sql查询,你应该没问题.

  • 没有将收到的JSON直接传递给SQL查询的提示特别有价值,谢谢:-)! (2认同)