有必要清理 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章
是否有必要清理 SocketAsyncEventArgs.Completed?