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

时间:2009-06-03 14:14:48

标签: javascript jquery security json eval

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

function PopulateSeriesFields(result) 
{
    data = eval('(' + result + ')');
    var myFakeExample = data.exampleType
}

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

由于

9 个答案:

答案 0 :(得分:25)

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

$.getJSON(url, function(data){
    alert(data.exampleType);
});
当您只与自己的服务器通信时,

eval()通常被认为是安全的JSON解析,尤其是当您在服务器端使用一个好的JSON库时,它保证生成的JSON不会包含任何令人讨厌的内容。

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

中的相应部分

答案 1 :(得分:19)

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

“手动”解析速度太慢,因此库中的JSON.parse实现会检查内容然后最终使用eval,因此它是still unsafe。但是,如果您使用的是较新的浏览器(IE8或Firefox),则库代码实际上并未执行。相反,原生浏览器支持会启动,然后您就安全了。

了解更多herehere

答案 2 :(得分:6)

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

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

JSON in Javascript

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

答案 3 :(得分:5)

不安全?这取决于你是否可以信任这些数据。

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

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

答案 4 :(得分:4)

如果您使用的是jQuery,从版本1.4.1开始,您可以使用jQuery.parseJSON()

请参阅此答案:Safe json parsing with jquery?

答案 5 :(得分:3)

使用JavaScript的eval是不安全的。因为JSON只是JavaScript的一个子集,但JavaScript的eval允许任何有效的JavaScript。

使用真正的JSON解析器,例如JSON parser from json.org

答案 6 :(得分:3)

评估代码的替代方法是手动解析它。它并不像听起来那么难,但在运行时却相当重。 You can read about it here.

需要注意的重要部分是评估JSON本身并不安全。只要你相信来源不要球。这包括确保传入JSON编码器的内容被正确转义(以阻止用户在用户机器上执行代码的流程两步)。

答案 7 :(得分:2)

你可以这样试试

var object = new Function("return " + jsonString)()

答案 8 :(得分:0)

另一个很好的选择是YUI: http://yuilibrary.com/yui/docs/json/

所以你的代码应该是这样的:

Y.JSON.parse('{"id": 15, "name": "something"}');