ajax 请求返回一个标准 JSON 数组,其中填充了用户的输入。输入已被清理,并且使用 eval() 函数,我可以轻松创建我的 javascript 对象并更新我的页面...

所以问题就在这里。无论我多么努力地尝试清理输入,我都不愿意使用 eval() 函数。我已经在 google 上检查了如何使用“AJAX 中的 JSON 而无需 eval”,并且运行了一堆不同的方法......

我应该使用哪一个?有没有一种标准的、经过验证的安全方法来做到这一点?

有帮助吗?

解决方案

json.org 有一个不错的 JavaScript 库

简单用法:

JSON.parse('[{"some":"json"}]');
JSON.stringify([{some:'json'}]);

编辑:正如评论中指出的,如果你查看它的源代码,它会使用 eval (尽管它看起来首先被清理)

要完全避免它,请查看 json_parse 或者 json-sans-eval

json2.js 不安全,json_parse.js 速度慢,json-sans-eval.js 不验证

其他提示

有没有一种标准的、经过验证的安全方法来做到这一点?

在即将推出的 JavaScript 的 ECMAScript 3.1 版本中,提出了一种执行此操作的标准方法: JSON解析.

IE8、Firefox 3.1/3.5 以及未来很可能的其他流行浏览器都将支持它。同时,您可以回退到或专门使用 eval()。它可能是邪恶的,也可能不是邪恶的;当然它会比 JSON.parse 慢。但这是当今解析 JSON 的常用方法。

如果攻击者能够将恶意 JavaScript 注入到您通过 JSON 吐出的内容中,那么您需要担心的问题比 eval-is-evil 更大。

我会说,一旦输入消毒,EVAL是最好的一段路要走。如果您的服务器得到妥协,人们将能够发送任何他们想要的脚本到客户端反正。因此,把一个eval是不是一个很大的安全隐患。如果你担心的人操纵数据包到达客户端,然后之前,再次脚本本身可以进行修改。

不要担心EVAL。但要确保将其包装在一个try ... catch块,所以如果你的JSON得到错位您的用户没有得到JS错误。

:)

为了安全地将 JSON 转换为 JS 对象,您应该使用 JSON 解析器,例如由 这个图书馆.

比较于该命令的设计模式: http://en.wikipedia.org/wiki/Command_pattern 。鉴于此,您可以精确定义客户端可以执行的操作,你的应用将是作为底层的解释是安全的。

取决于你试图与环卫完成的任务。我已经取得了巨大成功瓦特/ 原型框架对JSON和安全评估。支持

如果您确定有没有注射的风险,而你不是在一个循环eval()ing,然后使用eval()。这将有利地与这肯定会慢一些,可能会破坏其他选项,并会要求客户下载额外的代码。

这jQuery的 “偷”

// Try to use the native JSON parser first
return window.JSON && window.JSON.parse ?
    window.JSON.parse( data ) :
    (new Function("return " + data))();

<强>问题: 问题EVAL构成是,它在全球范围内执行

eval.call(document, "console.log(this)")
eval.call(navigator, "console.log(this)")
eval.call(window, "console.log(this)")
(function(){eval.call(document, "console.log(this)")})()
>Window

<强>情境:

假设使用的是在不同的文档元素的标记代码各个属性,诸如属性 onvisible

<img src="" onvisible="src='http://www.example.com/myimg.png';">

您想获得与此属性的所有元素,开启onvisible化内容的字符串转换成封闭并把它变成一个事件处理队列中。这就是JS Function构造开始发挥作用。

Function === 0..constructor.constructor
>true

Function('return [this, arguments]').call(window, 1,2,3)
>Window, Arguments[3]]
Function('return [this, arguments]').call(document, 1,2,3)
>Document, Arguments[3]]
Function('return [this, arguments]').call(navigator, 1,2,3)
>Navigator, Arguments[3]]    

全部放在一起:

var eventQueue = [];
var els = document.querySelectorAll('[onvisible]');

for (var el in els) {
    var jscode = els[el].getAttribute('onvisible');
    eventQueue.push( {el:els[el], cb:Function(jscode)} )
}

//eventQueue[0].cb.call(scope, args);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top