Eval 是邪恶的……那我应该用什么来代替?

IT技术 javascript ajax eval
2021-03-05 09:48:05

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

所以问题来了。无论我多么努力地清理输入,我都不想使用 eval() 函数。我已经检查了谷歌如何使用“没有 eval 的 AJAX 中的 JSON”并且已经运行了一堆不同的方法......

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

6个回答

json.org 有一个不错的javascript 库

简单用法:

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

编辑:正如评论中所指出的,如果您查看其源代码,则使用 eval (尽管它看起来首先经过了消毒)

要完全避免它,请查看json_parsejson-sans-eval

json2.js 是不安全的,json_parse.js 很慢,json-sans-eval.js 是非验证的

它仅使用 eval 作为本机不支持 JSON 对象的浏览器的后备,并且如果它没有“解析”功能。
2021-05-01 09:48:05
json2.js 是 从哪里不安全的它有 1mb 的正则表达式,用于在使用 eval 之前合成字符串
2021-05-04 09:48:05

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

在即将推出的 JavaScript 的 ECMAScript 3.1 版本中,有一种建议的标准方法:JSON.parse

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

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

我会说,一旦输入被清理, eval 是最好的方法。如果您的服务器遭到入侵,人们无论如何都可以向客户端发送他们想要的任何脚本。所以放置一个 eval 并不是一个很大的安全风险。如果您担心人们在数据包到达客户端之前对其进行操作,那么同样可以修改脚本本身。

不要担心评估。但是请确保将其包装在 try...catch 块中,这样如果您的 JSON 被破坏,您的用户就不会收到 JS 错误。

:)

要安全地将 JSON 转换为 JS 对象,您应该使用 JSON 解析器,例如此库提供的 JSON.parse() 函数

与命令设计模式进行比较:http : //en.wikipedia.org/wiki/Command_pattern鉴于此,您可以精确定义客户端可以执行的操作,并且您的应用程序将与底层解释一样安全。