快速提问。JavaScript 中的 eval 是不安全的,不是吗?我有一个 JSON 对象作为字符串,我需要将其转换为实际对象,以便获取数据:
function PopulateSeriesFields(result)
{
data = eval('(' + result + ')');
var myFakeExample = data.exampleType
}
如果有帮助,我将使用 jQuery 中的 $.ajax 方法。
谢谢
快速提问。JavaScript 中的 eval 是不安全的,不是吗?我有一个 JSON 对象作为字符串,我需要将其转换为实际对象,以便获取数据:
function PopulateSeriesFields(result)
{
data = eval('(' + result + ')');
var myFakeExample = data.exampleType
}
如果有帮助,我将使用 jQuery 中的 $.ajax 方法。
谢谢
好吧,不管安全与否,当你使用 jQuery 时,最好使用$.getJSON()方法,而不是 $.ajax():
$.getJSON(url, function(data){
alert(data.exampleType);
});
eval()当您仅与自己的服务器通信时,尤其是当您在服务器端使用良好的 JSON 库以保证生成的 JSON 不会包含任何令人讨厌的内容时,通常认为 JSON 解析是安全的。
甚至 JSON 的作者 Douglas Crockford 也说过eval(),除了解析 JSON 之外,你不应该在代码中的任何地方使用。请参阅他的书JavaScript: The Good Parts中的相应部分
您应该使用JSON并编写 JSON.parse。
“手动”解析太慢了,所以库中的 JSON.parse 实现会检查内容,然后最终使用 eval,所以它仍然是 unsafe。但是,如果您使用的是较新的浏览器(IE8 或 Firefox),则库代码不会实际执行。相反,本机浏览器支持启动,然后您就安全了。
如果您不能信任来源,那么您是正确的……eval 是不安全的。它可用于将代码注入您的页面。
查看此链接以获得更安全的替代方案:
该页面解释了 eval 不安全的原因,并在页面底部提供了指向 JSON 解析器的链接。
不安全?这取决于您是否可以信任数据。
如果您可以相信该字符串将是 JSON(并且不包括例如函数),那么它是安全的。
也就是说 - 如果您使用的是 jQuery,为什么要手动执行此操作?使用dataType选项指定它是 JSON 并让库为您处理它。
如果您使用的是 jQuery,则从 1.4.1 版开始,您可以使用 jQuery.parseJSON()
使用 JavaScripteval是不安全的。因为 JSON 只是 JavaScript 的一个子集,但 JavaScripteval允许任何有效的 JavaScript。
请改用真正的 JSON 解析器,例如 json.org中的 JSON 解析器。
评估代码的替代方法是手动解析它。它并不像听起来那么难,但在运行时要重得多。你可以在这里读到它。
需要注意的重要部分是评估 JSON 并不是天生不安全的。只要您相信消息来源,不要把事情搞砸。这包括确保传递到 JSON 编码器的内容被正确转义(以阻止人们在用户机器上执行代码的 2 个步骤)。
你可以试试这样
var object = new Function("return " + jsonString)()
另一个不错的选择是 YUI:http: //yuilibrary.com/yui/docs/json/
所以你的代码会是这样的:
Y.JSON.parse('{"id": 15, "name": "something"}');