是否需要清除JSON
Is sanitizing JSON necessary?
我认为不信任任何输入是网络上众所周知的最佳做法。句子
"所有输入都是邪恶的。"
可能是关于输入验证引用最多的引用。现在,对于HTML,您可以使用DOMPurify等工具对其进行消毒
我的问题是,如果我有一个运行Express和body解析器中间件的Node.js服务器来接收和解析JSON,我还需要运行任何清理吗?
我(也许很天真?)的想法是,JSON只是数据,而不是代码,如果有人发送无效的JSON,那么本体解析器(内部使用JSON.parse()
)无论如何都会失败,所以我知道我的应用程序会收到一个有效的JavaScript对象。只要我不对此运行eval或调用函数,我就应该没事,不是吗?
我是不是错过了什么?
由于JSON.parse()
不会在要解析的数据中运行任何代码,因此它不像eval()
那样易受攻击,但仍需要做一些事情来保护服务器和应用程序的完整性,例如:
- 在适当的位置应用异常处理程序,因为
JSON.parse()
可能引发异常 - 不要假设有什么数据,在使用之前必须明确测试数据
- 只处理您专门查找的属性(避免JSON中可能存在的其他内容)
- 将所有传入数据验证为合法、可接受的值
- 对数据长度进行Sanitize(以防止DOS中数据过大的问题)
- 不要将这些传入数据放在可以对其进行进一步评估的地方,例如直接放在页面的HTML中,或者直接注入SQL语句中,而不进行进一步的清理,以确保它对该环境是安全的
因此,要直接回答您的问题,"是的",除了使用body解析器之外还有更多的事情要做,尽管它是第一次处理数据的完美前线。在许多情况下,从主体解析器获得数据后,接下来要做的步骤非常重要,可能需要格外小心。
例如,这里有一个解析函数,它期望一个对象具有应用其中一些检查的属性,并为您提供一个仅包含您期望的属性的过滤结果:
// 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的早期用户通常会对接收到的字符串调用eval()
,这当然是一个巨大的安全漏洞。但是,正如您所说,JSON.parse
处理了大多数此类健全性检查。
例如,只要您确保不会从接收到的JSON对象中取出一些东西,并将其直接传递到SQL查询中,您就可以了。
相关文章:
- jQuery匹配JSON对象的部分文本
- 在循环中分配json值时,值被覆盖
- 需要帮助设置json数组
- 如何在Javascript中将JSon对象转换为数组
- 我可以在json对象中添加一个函数吗
- 使用JS将数组转换为json对象
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 使用JQuery解析JSON嵌套数组
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- 如何使用json将对象列表从java转换为javascript
- 是否需要清除JSON
- 通过JSON接收数据时,清除子下拉列表中的旧选项
- 正在清除最后一个JSON响应
- Regex表达式以清除无效的JSON
- 对象's的自定义属性在画布中被清除为json
- 如何为JSON清除缓存
- 为什么我的闭包变量在使用$后被清除.每个都使用JSON数据
- 从json文件中推入数组元素后被清除
- 在以JSON格式导入MongoDB之前,清除HTTP响应头中的非法字符
- 如何使用jquery清除json对象