有必要清理 JSON 吗?

Posted

技术标签:

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

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

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

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

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

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

我错过了什么吗?

【问题讨论】:

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

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

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

【讨论】:

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

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

    在适当的位置应用异常处理程序,因为JSON.parse() 可以引发异常。 不要假设存在哪些数据,您必须在使用前明确测试数据。 仅处理您专门寻找的属性(避免可能在 JSON 中的其他内容)。 将所有传入数据验证为合法、可接受的值。 清理数据长度(以防止 DOS 问题与过大的数据)。 请勿将这些传入数据放入可以进一步评估的位置,例如直接放入页面的 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;
    

【讨论】:

以上是关于有必要清理 JSON 吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 R 清理大数据中不必要的变量

我可以清理本地Composer目录吗?

是否有必要清理 SocketAsyncEventArgs.Completed?

当类暴露于线程池时,清理 ThreadLocal 资源真的是我的工作吗?

请问有啥更好的方法来清理echarts缓存吗?

cleanmymac3.9激活码有必要买吗,cleanmymac每次升级都要买激活码吗