0

当我在当前的代码中使用 evals 时,我最终看到了这个问题。

为什么使用 JavaScript eval 函数是个坏主意?

当您在浏览器中有 javascript 代码时,您可以将 javascript 作为 HTML 的一部分或作为单独的文件下载。源代码可供任何人查看和修改。我看不出通过 eval() 进行的注入攻击会比攻击源代码并改变它来做攻击者想要的更糟糕。

有人可以解释我错过了什么吗?或者在某些情况下 eval 是危险的,这不能(容易)通过更改源代码来实现。

4

3 回答 3

2

在 Javascript 注入攻击的情况下,您不必担心浏览器用户提供不受信任的代码。你担心来自其他地方的代码。例如,如果您从第三方站点下载数据,并且eval它,此代码将在用户页面的上下文中执行,并且可能会对用户的数据做坏事。因此,您相信第三方不会向您发送恶意 JS。

当然,我们经常这样做——我们中的许多人链接到 Google 或 Microsoft CDN 以获取 jQuery 和其他库。这些都是知名网站,我们选择信任它们以获得性能优势。但是随着网站变得不那么值得信赖,你必须更加小心,而不是盲目地执行他们发送给你的任何内容。

在某种程度上,跨站 AJAX 规则限制了这个第三方代码可以造成的损害。这些浏览器更改之所以到位,正是因为正在执行 XSS 攻击,并将用户私人数据发送给攻击者。但eval仍然允许某些类型的恶意软件,因此您必须小心使用它。

于 2013-09-02T13:08:26.483 回答
0

即使在您确定要评估的字符串是可信且安全的情况下,也不总是值得使用eval.

例如,如果您希望您的网页在 Mozilla Firefox OS 上作为应用程序可用,那么您eval将破坏它,因为它已被禁止。有关详细信息,请参阅此页面

同样,根据此文档,简单的使用eval在 Google Chrome 扩展程序中也不起作用。

如果您对要评估的字符串的安全性不是 100% 肯定,则应该eval完全避免。

于 2013-09-02T13:04:14.447 回答
0

让我们从您链接的问题中的土豆示例开始:

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 并不邪恶,但通常是不好的做法。

于 2013-09-02T13:05:27.520 回答