利用JavaScript的eval()方法

15
许多开发者认为应避免使用JavaScript 的eval()方法。从设计的角度来看,这个想法是有道理的。当存在一个更简单、更好的选项时,eval()通常被用作一个丑陋的解决方案。
然而,我不明白关于安全漏洞的担忧。确实,运行eval()赋予黑客能够运行你可以运行的任何JavaScript代码的能力。但他们不是已经可以做到这一点了吗?至少在Chrome中,开发者工具允许最终用户运行自己的JavaScript。那么,eval()比开发者工具更危险在哪里呢?

2
这并不是“普遍共识”。许多有经验的开发人员对于关于eval的FUD感到恼火。 “eval is evil”可能从未被有经验的编码人员说过。如果你很愚蠢,它可能是危险的。但通常它只是缓慢、丑陋并导致难以演变的代码。 - Denys Séguret
@DenysSéguret 我认为 Mozilla 的开发人员可以被视为经验丰富的。这篇 文章 建议避免使用 eval,改用 Function,他们声称这样做更快,也更安全,因为它只能访问全局作用域。 - N4ppeL
当然,通常有比eval更好的替代方案。我已经说过了(请阅读我的评论到最后)。我的观点是,“eval是邪恶的”可能是一个有趣的口号,但并不是一个有用的观点。顺便说一句,可以争论JS自2013年以来已经有所改变,因此试图重新唤起和辩论旧的话题可能最好留给历史学家。 - Denys Séguret
1
我强烈反对最后一部分的观点,因为人们仍然会在这里寻求建议,所以辩论绝对应该保持更新。这也是我想指出潜在替代方案的原因,当然,“Function”也应该谨慎使用。如果可能的话,应该使用JSON解析器或类似工具。还有一个更近期的主题讨论(https://dev59.com/z3VC5IYBdhLWcg3wvT1a),对于任何来到这里的人可能会感兴趣。 - N4ppeL
2个回答

21

正如B-Con所提到的那样,攻击者并不是坐在电脑前的人,因此可能正在使用您脚本中已经存在的eval()作为一种手段,以传递恶意代码到您的网站,以利用当前用户的会话(例如,用户遵循恶意链接)。

eval()的危险在于当它在未经过滤的值上执行时,可能会导致DOM Based XSS漏洞。

例如,请考虑以下HTML代码(有些牵强,但我希望它能说明问题)

<script>

eval('alert("Your query string was ' + unescape(document.location.search) + '");');

</script>
现在,如果查询字符串是?foo,则您只需获得一个警告对话框,其中显示以下内容:Your query string was ?foo 但是,此代码将允许用户将用户从其网站重定向到URL,例如http://www.example.com/page.htm?hello%22);alert(document.cookie+%22,其中www.example.com是您的网站。
这会修改由eval()执行的代码。
alert("Your query string was hello");
alert(document.cookie+"");

(为了清晰起见,我添加了换行符)。现在,这可能比显示当前 cookie 值更具有恶意性,因为攻击者在编码形式的查询字符串中通过链接传递所需的代码。例如,它可以通过资源请求将 cookie 发送到攻击者的域,从而使身份验证会话被劫持。

这适用于任何未经过滤并直接在 eval() 中执行的来自用户/外部输入的值,而不仅仅是如此示例中所示的查询字符串。


1
这很有道理。我之前认为 eval() 允许黑客入侵网站本身,而不是允许其他网站抓取用户数据。 - Jared Nielsen
2
不是直接的,但如果管理员用户被攻击,它可能会发生。 - SilverlightFox

6

攻击者无法访问用户浏览器的开发工具。攻击者很可能不是坐在电脑前的用户。

eval() 的危险在于攻击者可能能够以其他方式操纵最终通过 eval() 运行的数据。如果 eval() 的字符串来自 HTTP 连接,则攻击者可能执行中间人攻击并修改该字符串。如果字符串来自外部存储,则攻击者可能已经操纵了该存储位置中的数据。等等。


2
真正的问题在于来自任何用户提供的来源的字符串。无论使用eval与否,MITM攻击始终是一个问题。如果他们正在进行MITM攻击,他们可以像修改常规非evaled JS有效负载一样轻松地修改它。 - Matt
1
另一个经典的例子是使用eval函数来处理GET变量,这是打开XSS漏洞的简单方法。等等。 - B-Con

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接