当代码可用时,Javascript中的eval真的有安全风险吗

Are evals in Javascript really a security risk, when the code is available anyway.

本文关键字:真的 安全 eval 中的 代码 Javascript      更新时间:2023-09-26

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

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

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

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

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

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

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

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

例如,如果你想让你的网页作为应用程序在Mozilla Firefox OS上可用,eval会破坏它,因为它是被禁止的。有关详细信息,请参阅本页。

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

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

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

eval('document.' + potato + '.style.color = "red"');

假设您在站点中有一个名为potato的输入字段,当您要求用户选择"正文"或"表单[0]"时,您使用此输入和上面的代码来更改正文或您交付给其他用户的页面上的第一个表单的颜色(例如使用DB)。

现在假设一个适度邪恶的用户将其放入potato:

"title;alert('test');({style:{color:1}})"

然后发生的是警报。但这种情况可能更糟,比如对服务器的ajax调用提供了页面的机密内容。

正如您所看到的,这与SQL注入是同一类问题。

当然,要做到这一点,你必须非常愚蠢,即使用用户提供的字符串,并将它们放在其他计算机上包含敏感内容的页面上的evaled字符串中。这就是为什么我认为"eval is evil"主要是令人讨厌的FUD。

但另一个重要的点是,eval速度很慢,而且大多数时候都毫无用处,因为您可以获得更好、更清洁、更可维护的解决方案。

Eval不是邪恶的,但它通常是不好的做法。