利用JavaScript的eval()方法

Jar*_*sen 10 javascript security eval client-side code-injection

许多开发人员认为eval()应该避免使用JavaScript的方法.从设计角度来看,这个想法很有意义.当更简单,更好的选项可用时,它通常被用作丑陋的解决方法.

但是,我不了解安全漏洞的担忧.当然,运行eval()使黑客能够运行您可以运行的任何JavaScript代码.

但他们不能这样做吗?至少在Chrome中,开发人员工具允许最终用户运行自己的JavaScript.如何eval()比开发人员工具更危险?

Sil*_*Fox 13

正如B-Con所提到的那样,攻击者不是坐在计算机上的人,因此可以使用eval()脚本中的已经作为将恶意代码传递到您的站点的手段,以便在某种程度上利用当前用户的会话(例如,用户关注恶意链接).

危险eval()在于它是在未经过消毒的值上执行的,并且可能导致基于DOM的XSS漏洞.

例如,考虑HTML中的以下代码(相当人为,但它表明了我希望的问题)

<script>

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

</script>
Run Code Online (Sandbox Code Playgroud)

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

但是,此代码允许用户执行的操作是将用户从其站点重定向到URL,例如http://www.example.com/page.htm?hello%22);alert(document.cookie+%22www.example.com是您的网站.

这会修改由eval()to 执行的代码

alert("Your query string was hello");
alert(document.cookie+"");
Run Code Online (Sandbox Code Playgroud)

(为了清楚起见,我添加了新的线条).现在这可能比显示当前cookie值更恶意,因为所需代码只是由攻击者的编码形式的链接传递给查询字符串.例如,它可能在资源请求中将cookie发送到攻击者的域,从而使身份验证会话被劫持.

这适用于来自用户/外部输入的任何未经过消毒并直接在其中执行的值eval(),而不仅仅是此处所示的查询字符串.

  • 不是直接的,但如果管理员用户成为目标,它就可以做到。 (2认同)

小智 6

攻击者无权访问用户浏览器的开发人员工具。攻击者很可能不是坐在电脑前的用户。

危险eval()在于攻击者可能能够操纵最终eval()以其他方式运行的数据。如果eval()'d 字符串来自 HTTP 连接,攻击者可能会执行 MITM 攻击并修改字符串。如果字符串来自外部存储,攻击者可能已经操纵了该存储位置中的数据。等等。

  • 真正的问题是来自用户提供的任何来源的字符串。MITM 攻击将永远是一个问题,不管 `eval`。如果他们在做 MITM,他们可以同样轻松地修改常规的未评估的 JS 负载。 (2认同)