当我在当前的代码中使用 evals 时,我最终看到了这个问题。
为什么使用 JavaScript eval 函数是个坏主意?
当您在浏览器中有 javascript 代码时,您可以将 javascript 作为 HTML 的一部分或作为单独的文件下载。源代码可供任何人查看和修改。我看不出通过 eval() 进行的注入攻击会比攻击源代码并改变它来做攻击者想要的更糟糕。
有人可以解释我错过了什么吗?或者在某些情况下 eval 是危险的,这不能(容易)通过更改源代码来实现。
当我在当前的代码中使用 evals 时,我最终看到了这个问题。
为什么使用 JavaScript eval 函数是个坏主意?
当您在浏览器中有 javascript 代码时,您可以将 javascript 作为 HTML 的一部分或作为单独的文件下载。源代码可供任何人查看和修改。我看不出通过 eval() 进行的注入攻击会比攻击源代码并改变它来做攻击者想要的更糟糕。
有人可以解释我错过了什么吗?或者在某些情况下 eval 是危险的,这不能(容易)通过更改源代码来实现。
在 Javascript 注入攻击的情况下,您不必担心浏览器用户提供不受信任的代码。你担心来自其他地方的代码。例如,如果您从第三方站点下载数据,并且eval
它,此代码将在用户页面的上下文中执行,并且可能会对用户的数据做坏事。因此,您相信第三方不会向您发送恶意 JS。
当然,我们经常这样做——我们中的许多人链接到 Google 或 Microsoft CDN 以获取 jQuery 和其他库。这些都是知名网站,我们选择信任它们以获得性能优势。但是随着网站变得不那么值得信赖,你必须更加小心,而不是盲目地执行他们发送给你的任何内容。
在某种程度上,跨站 AJAX 规则限制了这个第三方代码可以造成的损害。这些浏览器更改之所以到位,正是因为正在执行 XSS 攻击,并将用户私人数据发送给攻击者。但eval
仍然允许某些类型的恶意软件,因此您必须小心使用它。
让我们从您链接的问题中的土豆示例开始:
eval('document.' + potato + '.style.color = "red"');
假设potato
当您要求用户选择“body”或“forms[0]”时,您的站点中有一个输入字段,称为您提供给其他用户的页面(例如使用数据库)。
现在假设一个中等邪恶的用户把它放在里面potato
:
"title;alert('test');({style:{color:1}})"
然后发生的是警报。但这可能会更糟,例如对提供页面机密内容的服务器的 ajax 调用。
如您所见,它与 SQL 注入的问题大致相同。
当然,您必须非常愚蠢才能做到这一点,即使用用户提供的字符串并将它们evaled
放在其他计算机上具有敏感内容的页面上的字符串中。这就是为什么我认为这"eval is evil"
主要是烦人的 FUD。
但另一个重要的一点是它eval
很慢,而且大多数时候没有用,因为您可以拥有更好、更清洁、更易于维护的解决方案。
Eval 并不邪恶,但通常是不好的做法。