我认为这是网上众所周知的最佳做法,不信任任何意见。句子
"所有输入都是邪恶的。"
可能是输入验证方面引用最多的引用。现在,对于HTML,您可以使用DOMPurify等工具对其进行清理。
我的问题是,如果我有运行Express和body-parser中间件的Node.js服务器来接收和解析JSON,我是否还需要运行任何清理?
我(也许天真?)对此的想法是JSON只是数据,没有代码,如果有人发送无效的JSON,身体解析器(内部使用JSON.parse()
)无论如何都会失败,所以我知道我的应用程序将收到一个有效的JavaScript对象。只要我不打算使用eval或调用函数,我应该没事,不应该吗?
我错过了什么吗?
答案 0 :(得分:17)
由于JSON.parse()
没有在要解析的数据中运行任何代码,因此它不像eval()
那样容易受到攻击,但是仍然需要做些什么来保护服务器的完整性和应用程序如:
JSON.parse()
可能会抛出异常。所以,要直接回答你的问题,“是”除了使用正文解析器之外还有更多工作要做,尽管它是第一次处理数据时非常精细的前线。从身体解析器获取数据后,您对数据执行的后续步骤在许多情况下都很重要,可能需要额外的小心。
作为一个例子,这是一个解析函数,它期望一个对象具有应用其中一些检查的属性,并为您提供仅包含您期望的属性的过滤结果:
// 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;
}
}
答案 1 :(得分:5)
你应该没事。早期的JSON用户通常会在收到的字符串上调用eval(),这当然是一个巨大的安全漏洞。但是,正如你所说,JSON.parse处理大多数这类理智检查。
例如,只要你确保不要从收到的JSON对象中取出一些内容并将其直接传递给sql查询,你应该没问题。