我有一个我希望防范XSS的Web应用程序。特别是,没有:
然而(不幸的是)有许多内联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 '';
我错过了什么吗?
除了将所有内联JS移动到外部文件之外,还有一些更简单的方法来缓解unsafe-inline
风险吗?
答案 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附加到其注入的脚本标记中。您可以将该值保存在会话中,以防止在每页加载时生成额外的处理。