Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用CSP防止自动点击链接XSS攻击_Javascript_Xss_Content Security Policy - Fatal编程技术网

Javascript 使用CSP防止自动点击链接XSS攻击

Javascript 使用CSP防止自动点击链接XSS攻击,javascript,xss,content-security-policy,Javascript,Xss,Content Security Policy,虽然使用CSP的目的稍有不同(沙箱),但我意识到一个非常简单的自动点击链接似乎可以绕过甚至相对严格的CSP。我的描述如下: 内容安全策略: default-src 'none'; script-src 'unsafe-inline'; 和机构: <a href="http://www.google.com">test</a> <script> document.querySelector("a").click(); </script> 然后

虽然使用CSP的目的稍有不同(沙箱),但我意识到一个非常简单的自动点击链接似乎可以绕过甚至相对严格的CSP。我的描述如下:

内容安全策略:

default-src 'none'; script-src 'unsafe-inline';
和机构:

<a href="http://www.google.com">test</a>
<script>
  document.querySelector("a").click();
</script>

然后可以像调用
api.ext?method=那样调用此文件。这不太可能是一种令人满意的方法—显然它不是基于CSP的—但如果您确实必须防止此类攻击,它可能是您唯一的选择。在使用类似的方法之前,请确保确实没有办法禁用内联脚本(这应该涵盖大多数攻击)。此外,你应该向公众发送你的反馈-webappsec@w3.org主题为[CSP2]的邮件列表

以下是我(不完整)的想法:

您必须为location、location.href、window.open和其他允许重定向到其他页面的函数/属性/事件实施类似的保护。如果你只错过了一个,那么你仍然很脆弱。表单、XHR和大多数其他资源都可以由CSP本身覆盖。据我所知,原型黑客在一些旧浏览器中不起作用


再一次,我不建议使用这个。您犯错误、在某些浏览器中不起作用或将添加可用于重定向的新API的可能性太高。

内容安全策略是为了页面本身的安全。导航到另一个页面不是绕过或与CSP有关的内容。CSP只关心您的页面及其功能。这也不是限制终端用户使用浏览器的效用(比如安装插件或打开链接的能力)


这收紧了策略,不允许任何地方出现XHR/Fetch/WebSockets/CSS/Font/JavaScript/Plugin内容。它们都有各自的属性,但如果没有,则使用默认属性。您还没有尝试在javascript中执行这些操作

script-src 'unsafe-inline';
这放松了策略,允许使用嵌入到页面中的任何javascript。这包括onclick/onhover和整个不安全属性家族。引述:

在任何一种情况下,作者都不应将“不安全的内联”或数据:作为有效源包含在其策略中。两者都允许代码直接包含在文档本身中,从而支持XSS攻击;最好完全避免它们


相反,如果出于任何原因需要在文档本身中嵌入内容,则可以在策略字符串中放置哈希值和nonce值,以将内联脚本列入白名单。

CSP是减少XSS造成损害的方法之一,但它绝不是解决XSS漏洞引起的所有问题的魔杖。该非目标也在以下文件中明确列出:

内容安全策略(CSP)并非针对内容注入漏洞的第一道防线。相反,CSP最好用作纵深防御,以减少内容注入攻击造成的伤害。作为防止内容注入的第一道防线,服务器操作员应验证其输入并对其输出进行编码

如果必须运行JavaScript代码,但不能信任代码,则可以使用沙盒指令为页面提供服务,而不使用
allow same origin
标志。使用此CSP指令,页面将在唯一的安全源运行,该安全源不与显示的源共享任何状态(即cookie、DOM存储、数据库等)。因此,注入的脚本无法泄漏信息,因为它们首先无法获取信息

例如,要允许运行内联脚本,但不访问同一原始数据,请使用:

default-src 'none'; script-src 'unsafe-inline'; sandbox allow-scripts

不要像另一个答案所建议的那样将JavaScript方法列入黑名单,因为1)您总是会忽略某个方法,2)禁用JavaScript API可能会以意外的方式破坏您的web应用程序,3)攻击者只需要一个漏洞就可以进行破坏,而您的(自定义)应用程序可能至少包含一种可能被攻击者滥用的方法。

您可能希望将鼠标悬停在csp标记上。。有太多的TLA(三个字母的首字母缩写),你选择了错误的一个…如果没有
不安全的内联
?@levi如果你有一个XSS漏洞,你可以从第一个字符(罕见,但不是看不见的)控制全部内容,你可以简单地在外部嵌入中自嵌入,在内部嵌入javascript。但无论如何,这只是一个旁注,
connectsrc
的存在表明CSP也关心Javascript评估XSS漏洞。@MarcB啊,我的错,我不小心,在我的另一篇文章中正确地得到了它,不知道我为什么在这一点上错了。@JacobBundgaard如果你阅读了整个问题或评论,你会看到1)即使没有
不安全的内联
,攻击仍然可以执行,2)CSP与此类攻击有关,这已被
连接src
的存在所证明。正如我在文章中所说的那样实际上,当我试图创建一个沙盒环境时,我正在研究这个问题,对于我的个人需求来说,这似乎是Google Caja的一个非常有趣的替代方案(我并不真的需要Google Caja提供的所有额外的东西)。不管怎样,关于这个问题,我认为这可能是一个可行的方法,如果创建一个独立的库,唯一的目的是阻止这类事情。我想,我打算花一整晚的时间来绕开这个问题:D。这并没有花我想象的那么长时间。在特定元素上调度一个
MouseEvent
,仍然可以获得点击。也许有人可以通过修补
dispatchEvent
,来解决这个问题,嗯,让我们看看~直到现在才有时间写正确的评论,但是修补dispatchEvent要比这困难得多:事件冒泡,应该允许调度其他事件。
default-src 'none';
script-src 'unsafe-inline';
default-src 'none'; script-src 'unsafe-inline'; sandbox allow-scripts