JSON数据 - 解析或'评估'

时间:2009-07-17 13:51:54

标签: javascript security json

从安全角度来看,我可以看到对传入的JSON数据执行'eval'是一个严重的错误。如果你得到如下数据,你会遇到一些问题。

{ someData:((function() { 
    alert("i'm in ur code hackin' ur page"); 
})()) }

我想知道最受欢迎的Javascript库有什么作用?它是手动解析还是仅仅是eval?

[编辑]

我不是在问是否应该eval / parse - 我问的是一些流行的Javascript库使用了什么方法(jQuery,Prototype等等)

4 个答案:

答案 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 提供安全evalHere 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版本是最新的   你会得到补丁   释放。