用于解析JSON的JavaScript eval()的替代方法

Dam*_*ien 18 javascript security jquery json eval

快速问题.JavaScript中的Eval是不安全的,不是吗?我有一个JSON对象作为字符串,我需要把它变成一个实际的对象,所以我可以获取数据:

function PopulateSeriesFields(result) 
{
    data = eval('(' + result + ')');
    var myFakeExample = data.exampleType
}
Run Code Online (Sandbox Code Playgroud)

如果它有助于我使用jQuery中的$ .ajax方法.

谢谢

Ren*_*soo 26

好吧,安全与否,当你使用jQuery时,你最好使用$ .getJSON()方法,而不是$ .ajax():

$.getJSON(url, function(data){
    alert(data.exampleType);
});
Run Code Online (Sandbox Code Playgroud)

eval() 当您只与自己的服务器通信时,尤其是当您在服务器端使用良好的JSON库时,通常认为JSON解析是安全的,这可以保证生成的JSON不会包含任何令人讨厌的东西.

即使是JSON的作者Douglas Crockford也表示eval(),除了解析JSON之外,你不应该在代码中的任何地方使用它.请参阅JavaScript:The Good Parts一书中的相应部分

  • "getJSON"与使用数据类型为"json"的$ .ajax完全相同... (17认同)
  • 除了$ .getJSON()几乎没有提供$ .ajax()的灵活性.特别是在处理错误,成功/完成事件等方面...... (8认同)
  • 当然,bug getJSON()写得更短. (4认同)

but*_*oxa 19

您应该使用JSON并编写JSON.parse.

"手动"解析太慢,因此库中的JSON.parse实现会检查内容然后最终使用eval,因此它仍然不安全.但是,如果您使用的是较新的浏览器(IE8或Firefox),则库代码实际上并未执行.相反,本机浏览器支持开始,然后你是安全的.

在这里这里阅读更多.


Jus*_*ner 6

如果你不相信来源,那么你是正确的... eval是不安全的.它可以用于将代码注入您的页面.

查看此链接以获得更安全的替代方案:

Javascript中的JSON

该页面解释了为什么eval不安全,并提供了指向页面底部的JSON解析器的链接.


Que*_*tin 5

不安全?这取决于您是否可以信任数据.

如果你可以相信字符串将是JSON(并且不包括,例如,函数)那么它是安全的.

也就是说 - 如果您使用的是jQuery,为什么要手动执行此操作?使用dataType选项指定它是JSON并让库为您处理它.

  • @JP:但是只有JSON不可用.http://dev.jquery.com/browser/trunk/jquery/src/ajax.js#L504 (2认同)