从安全角度来看,我可以看到简单地做对传入的JSON数据的“EVAL”作为一个严重的错误。 如果你有数据,如下面你就会有一些问题。
{ someData:((function() {
alert("i'm in ur code hackin' ur page");
})()) }
我不知道什么最流行的JavaScript库吗? 它是一个人工解析或者只是一个eval?
[编辑]
我没有问我是否应该EVAL /解析-我是问什么方法所使用的一些流行的JavaScript库(jQuery的,原型,等...)
下面是什么官JavaScript分析器的作用:
// 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解析的支持是在现代浏览器,这是所有(基于库的)安全JSON解析器做(即正则表达式测试之前eval
)。
安全库 (除了官方json2实现)
Prototype的isJSON
功能。
Mootools的JSON.decode
函数(同样,通过之前的正则表达式测试eval
)。
不安全库 :
道场的fromJson
不提供安全eval
ING。 这里是他们的整个实施(减去评论) :
dojo.fromJson = function(json) {
return eval("(" + json + ")");
}
jQuery的不提供安全的JSON eval
“荷兰国际集团,但看到官方插件的secureEvalJSON
功能(线143)。
你绝对应该分析它! JSON只是JavaScript的一个子集。 但是, eval
将评估任何JavaScript代码,而不是像一个JSON解析器,特定子集会。
使用evalJSON()呢?
据我所知,这主要调用eval()函数的一些卫生检查后。
从http://code.google.com/p/json-sans-eval/ :
在JavaScript中快速和安全的JSON解析器?
这JSON解析器不尝试验证JSON,所以可能会返回一个结果给定一个语法上是无效的输入,但不使用eval所以是确定的,保证不会修改低于其返回值以外的任何物体。
有一些在JavaScript JSON解析器的? 在json.org。 这种实现方式应该何时使用,安全性是一个问题(当JSON可能来自不受信任的来源),速度是一个问题,并示数上畸形的JSON是不是一个问题。
此实现
json_parse.js
json2.js
json2.js是非常快的,但存在安全隐患的,因为它调用的eval解析JSON数据,所以攻击者可能能够提供奇怪的JS,看起来像JSON,但执行任意JavaScript。
如果你必须使用json2.js与不受信任的数据,一定要保持你的json2.js的版本是最新的,让你得到补丁他们释放。