从安全角度来看,我可以看到对传入的JSON数据执行'eval'是一个严重的错误。如果你得到如下数据,你会遇到一些问题。
{ someData:((function() {
alert("i'm in ur code hackin' ur page");
})()) }
我想知道最受欢迎的Javascript库有什么作用?它是手动解析还是仅仅是eval?
[编辑]
我不是在问我是否应该eval / parse - 我问的是一些流行的Javascript库使用了什么方法(jQuery,Prototype等等)
答案 0 :(得分:7)
以下是official JavaScript parser的作用:
// In the second stage, we run the text against regular expressions that look
// for non-JSON patterns. We are especially concerned with '()' and 'new'
// because they can cause invocation, and '=' because it can cause mutation.
// But just to be safe, we want to reject all unexpected forms.
// We split the second stage into 4 regexp operations in order to work around
// crippling inefficiencies in IE's and Safari's regexp engines. First we
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
// replace all simple value tokens with ']' characters. Third, we delete all
// open brackets that follow a colon or comma or that begin the text. Finally,
// we look to see that the remaining characters are only whitespace or ']' or
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
if (/^[\],:{}\s]*$/.
test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
// In the third stage we use the eval function to compile the text into a
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.
j = eval('(' + text + ')');
...
除了现代浏览器中的内置JSON parsing support之外,这是所有(基于库的)安全JSON解析器所做的事情(即eval
之前的正则表达式测试)。 / p>
安全库(除了官方的json2实现)
Prototype的isJSON
功能。
Mootools'JSON.decode
功能(再次通过regex test before eval
)。
不安全的库:
道场的fromJson
不提供安全eval
。 Here is their entire implementation (minus comments):
dojo.fromJson = function(json) {
return eval("(" + json + ")");
}
jQuery不提供安全的JSON eval
,但请参阅官方插件的secureEvalJSON
功能(第143行)。
答案 1 :(得分:1)
你应该完全解析它! JSON只是JavaScript的一个子集。但eval
将评估任何JavaScript代码,而不是像JSON解析器那样的特定子集。
答案 2 :(得分:0)
使用evalJSON()代替? 据我所知,这经常在卫生检查后调用eval()。
答案 3 :(得分:0)
来自http://code.google.com/p/json-sans-eval/:
快速安全的JSON解析器 的JavaScript?
此JSON解析器不会尝试 验证JSON,所以可以返回一个 结果给出语法无效 输入,但不使用eval所以 确定性的,并保证不会 修改除其之外的任何对象 返回值。
有许多JSON解析器 JavaScript的?在json.org。这个 应该随时使用实现 安全性是一个问题(当JSON可能 来自不受信任的来源),速度 是一个问题,并且错误 格式错误的JSON不是问题。
此实施
- 优点快速,安全
- 缺点未验证
json_parse.js
- 优点验证,安全
- Cons Slow
json2.js
- 优点快,一些验证
- 缺点可能不安全
json2.js非常快,但可能 不安全,因为它调用eval来解析 JSON数据,所以攻击者可能是 能够提供看起来很奇怪的JS 像JSON,但它执行任意 的JavaScript。
如果你必须使用json2.js 不受信任的数据,请务必保留 你的json2.js版本是最新的 你会得到补丁 释放。