问题:我正在使用eval来解析我的一个WebMethods的JSON返回值。
我不想添加jquery-json,因为传输量已经非常大了。
所以我用eval解析JSON返回值。
现在谣言说这是不安全的。为什么?
除非他们破解我的服务器,否则没有人可以修改JSOn返回值,在这种情况下,无论如何我都会遇到更大的问题。
如果他们在本地执行,JavaScript只会在他们的浏览器中执行。
所以我没有看到问题出在哪里。
使用这个具体的例子,任何人都可以对此有所了解吗?
function OnWebMethodSucceeded(JSONstrWebMethodReturnValue)
{
var result=eval('(' + JSONstrWebMethodReturnValue + ')')
... // Adding result.xy to a table
}
答案 0 :(得分:14)
基本问题是eval
可以运行任何JavaScript,而不仅仅是反序列化JSON格式的数据。使用它来处理来自不受信任或半可信来源的JSON时存在风险。将JSON包装在括号中的常见技巧不足以确保不执行任意JavaScript。考虑一下这个“JSON”,它实际上不是:
function(){alert('Hi')})(
如果你在变量x
中有这个并且做了这个:
var result = eval("(" + x + ")");
...你会看到一个警报 - JavaScript运行了。安全问题。
如果您的数据来自可靠来源(听起来像是这样),我不会太担心它。也就是说,你可能对Crockford的讨论感兴趣here(Crockford是JSON的发明者和一个知识渊博的JavaScript人物)。 Crockford还在this page上提供了至少三个你可能考虑使用的公共域解析器:他的json2.js解析器和字符串化器,它在缩小时只有2.5k大小,但它仍然使用eval
(它只是先采取一些预防措施);他的json_parse.js,这是一个不使用eval
的递归下降解析器;和他的json_parse_state.js,状态机解析器(再次不使用eval
)。所以你可以选择你的毒药。 (向Camilo Martin喊出来指出最后两个选择。)
答案 1 :(得分:4)
JSON解析和编码越来越多地在现代浏览器中可用,[wikipedia reference]这为您的应用程序提供了安全的JSON功能,而无需加载额外的库。
您可以通过执行以下操作来测试本机JSON支持:
var native_JSON_exists = typeof window.JSON === 'object';
你应该加载一个JSON解析库,如Douglas Crockford(由上面的T.J.Crowder链接)或者通过framewok提供的功能,用于没有原生支持的浏览器。 (但是你应该至少在支持它的浏览器中使用原生JSON,以保护足够幸运的用户拥有现代浏览器)
请记住,JSON是JavaScript语法的一个子集,因此在JavaScript eval语句中工作的字符串可能无法在正确的JSON解析中使用。您可以使用JSLint(http://www.jslint.com/)测试JSON字符串中的错误。