19

快速提问。JavaScript 中的 eval 是不安全的,不是吗?我有一个 JSON 对象作为字符串,我需要将其转换为实际对象,以便获取数据:

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

如果有帮助,我将使用 jQuery 中的 $.ajax 方法。

谢谢

4

9 回答 9

27

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

$.getJSON(url, function(data){
    alert(data.exampleType);
});

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

甚至 JSON 的作者 Douglas Crockford 也说过eval(),除了解析 JSON 之外,你不应该在代码中的任何地方使用。请参阅他的书JavaScript: The Good Parts中的相应部分

于 2009-06-03T14:28:49.437 回答
19

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

“手动”解析太慢了,所以库中的 JSON.parse 实现会检查内容,然后最终使用 eval,所以它仍然是 unsafe。但是,如果您使用的是较新的浏览器(IE8 或 Firefox),则库代码不会实际执行。相反,本机浏览器支持启动,然后您就安全了。

在此处此处阅读更多信息。

于 2009-06-03T14:44:47.783 回答
6

如果您不能信任来源,那么您是正确的……eval 是不安全的。它可用于将代码注入您的页面。

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

Javascript 中的 JSON

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

于 2009-06-03T14:23:54.627 回答
5

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

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

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

于 2009-06-03T14:19:50.063 回答
4

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

看到这个答案:Safe json parsing with jquery?

于 2010-08-10T16:40:17.710 回答
3

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

请改用真正的 JSON 解析器,例如 json.org中的 JSON 解析器。

于 2009-06-03T14:21:29.640 回答
3

评估代码的替代方法是手动解析它。它并不像听起来那么难,但在运行时要重得多。你可以在这里读到它。

需要注意的重要部分是评估 JSON 并不是天生不安全的。只要您相信消息来源,不要把事情搞砸。这包括确保传递到 JSON 编码器的内容被正确转义(以阻止人们在用户机器上执行代码的 2 个步骤)。

于 2009-06-03T14:21:42.883 回答
2

你可以试试这样

var object = new Function("return " + jsonString)()
于 2011-07-13T10:35:34.627 回答
0

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

所以你的代码会是这样的:

Y.JSON.parse('{"id": 15, "name": "something"}');
于 2012-03-09T17:05:00.683 回答