由于JSON.parse()
不运行任何代码值对在对数据进行分析,所以它是不容易的方式eval()
是,竟然还有件事情你应该做些什么来保护您的服务器和应用程序的完整性,如:
- 应用异常处理程序因为
JSON.parse()
可能会引发异常。
- 不要对有什么数据做出假设,你必须在使用数据之前明确地测试数据。
- 仅处理您正在查找的属性(避免可能存在于JSON中的其他内容)。
- 验证所有传入数据为合法的可接受值。
- 净化数据的长度(以防止数据过大的DOS问题)。
- 不要将这些传入的数据放入可以进一步评估的位置,例如直接放入页面的HTML中,或直接注入SQL语句中而不进行进一步的清理以确保其对于该环境是安全的。
因此,要直接回答您的问题,“是”还有更多的工作要做,而不仅仅是使用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;
}
}
这听起来对我来说,像body-parser已经在消毒输入,所以你不应该自己这样做。另一方面,除非它是性能瓶颈,否则对输入进行双重消毒没有任何坏处。 – 2014-09-22 21:08:59