我最后查看了这个问题,因为我在当前的代码中使用了evals。
Why is using the JavaScript eval function a bad idea?
如果您在浏览器中有javascript代码,则可以将javascript作为HTML的一部分下载或作为单独的文件下载。任何人都可以查看和修改源代码。我没有看到通过eval()的注入攻击如何比攻击源代码更糟糕,并改变它来做攻击者想要的事情。
有人可以解释我错过了什么吗?或者某种情况下,eval是危险的,通过改变源代码无法(轻松)实现。
答案 0 :(得分:2)
在Javascript注入攻击的情况下,您并不担心浏览器用户提供不受信任的代码。你担心来自其他地方的代码。例如,如果您从第三方网站下载数据,并eval
,则此代码将在用户页面的上下文中执行,并且可能会对用户的数据执行不良操作。因此,您相信第三方不会向您发送邪恶的JS。
当然,我们经常这样做 - 我们很多人都链接到Google或Microsoft CDN来获取jQuery和其他库。这些都是众所周知的网站,我们选择信任它们以获得性能优势。但随着网站变得不那么值得信赖,你必须更加小心,而不是只是执行他们盲目发送的任何内容。
在某种程度上,跨站点AJAX规则限制了此第三方代码可以造成的损害。正是因为正在执行XSS攻击并将用户私有数据发送给攻击者,这些浏览器更改才得以实施。但eval
仍允许某些类型的恶意软件,因此您必须小心使用它。
答案 1 :(得分:0)
即使在您确定要评估的字符串是可信且安全的情况下,eval
并不总是值得。
例如,如果您希望自己的网页可以作为应用程序在Mozilla Firefox OS上使用,eval
会破坏它,因为它已被禁止。有关详细信息,请参阅this page。
同样,根据this doc,简单使用eval
在Google Chrome扩展程序中无效。
如果您对要评估的字符串的安全性没有100%肯定,则应完全避免使用eval
。
答案 2 :(得分:0)
让我们从您链接的问题中的马铃薯示例开始:
eval('document.' + potato + '.style.color = "red"');
当您要求用户选择“body”或“forms [0]”并假设您使用此输入和上面的代码更改颜色时,假设您的网站中有一个名为potato
的输入字段您提供给其他用户的页面上的正文或第一个表单(例如使用数据库)。
现在假设一个中等恶劣的用户将其置于potato
:
"title;alert('test');({style:{color:1}})"
然后发生的是警报。但这可能更糟糕,就像ajax调用服务器提供页面的机密内容。
正如您所看到的,它与SQL注入有同样的问题。
当然,你必须非常愚蠢才能这样做,即使用用户提供的字符串并将它们放在具有敏感内容的页面上的其他计算机上的evaled
字符串中。这就是为什么我认为"eval is evil"
主要是烦人的FUD。
但另一个重要的一点是eval
很慢,而且大部分时间都没用,因为你可以拥有更好,更清洁,更易维护的解决方案。