如何使用内容安全策略保护XSS中的单域webapp?

时间:2016-02-29 09:53:10

标签: security xss

我有一个我希望防范XSS的Web应用程序。特别是,没有:

  • 向其他域提交提交
  • 来自其他域的JS文件
  • 指向其他域的链接
  • iframes,embeds,objects

然而(不幸的是)有许多内联JS,我将转移到JS文件,以便我可以从CSP中删除unsafe-inline

我看到它的方式,内容安全策略应如下所示:

default-src 'self' 'unsafe-inline'; 
child-src 'none'; 
frame-src 'none'; 
object-src 'none'; 
base-uri 'self'; 
form-action 'self'; 
frame-ancestors 'none'; 
plugin-types 'none'; 
report-uri 'self'; 
sandbox '';
  1. 我错过了什么吗?

  2. 除了将所有内联JS移动到外部文件之外,还有一些更简单的方法来缓解unsafe-inline风险吗?

1 个答案:

答案 0 :(得分:1)

如果你真的想要,可以使用内联代码。

请参阅“如果您绝对必须使用它......”部分here

基本上,您要么使用nonce标记

上的script属性
<script nonce=EDNnf03nceIOfn39fn3e9h3sdfa>
  //Some inline code I cant remove yet, but need to asap.
</script>

然后在CSP中引用此nonce:

Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa' 

或者您生成脚本内容的SHA哈希值,然后在CSP中引用它:

Content-Security-Policy: script-src 'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng='

完成此操作后,您将要删除“unsafe-inline”指令,以使您的CSP生效。请注意,您只能以这种方式执行<script>块,而不能使用支持脚本的属性(例如OnMouseOver)。但是,您可以使用外部JavaScript或上面允许的<script>块来分配这些事件。

请记住,任何nonce应该使用CSPRNG即时生成,否则任何攻击者都可以简单地将静态nonce附加到其注入的脚本标记中。您可以将该值保存在会话中,以防止在每页加载时生成额外的处理。