如何使用内容安全策略保护单域 webapp 免受 XSS 攻击?

How to protect single domain webapp from XSS with Content Security Policy?

我有一个要防止 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 '';
  1. 我错过了什么吗?

  2. 是否有比将所有内联 JS 移动到外部文件更简单的方法来减轻 unsafe-inline 风险?

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

请参阅 "If You Absolutely Must Use It…" 部分 here

基本上您可以在 script 标签上使用 nonce 属性

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

然后在 CSP 中引用这个随机数:

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> 块分配此类事件。

请记住,任何随机数都应该使用 CSPRNG 即时生成,否则任何攻击者都可以简单地将静态随机数附加到他们注入的脚本标签中。不过,您可以针对会话保存该值,以防止在每次页面加载时生成它时进行额外处理。