我想知道 Content-Security-Policy
标头是否应该/可以包含 external JavaScript files 的哈希值(也就是具有 src
属性 <script src="foo.js"></script>
的标签)。
在基于 Chromium 的浏览器和 Mozilla Firefox 中,我的外部脚本被阻止,即使在 Content-Security-Policy
标头中包含所有这些脚本的哈希值:
script-src 'sha256-Dxn+cR58x5haydQ1S/lvgMBLRahDCNxsakeubYGDJD0=' 'sha256-WiXxwK6878G5m29xzbpoI/6mHv7Otw1epCuigPupglA=' 'sha256-B5Xt87JgO41oTYQ2MabCc4UUuiVbcT/ingSs4HJHt1U=';
我也试过
script-src 'strict-dynamic' 'sha256-Dxn+cR58x5haydQ1S/lvgMBLRahDCNxsakeubYGDJD0=' 'sha256-WiXxwK6878G5m29xzbpoI/6mHv7Otw1epCuigPupglA=' 'sha256-B5Xt87JgO41oTYQ2MabCc4UUuiVbcT/ingSs4HJHt1U=';
我的 HTML 包含外部脚本:
...
<!-- These are Webpack generated scripts built with the Angular CLI -->
<script src="runtime.78e54b12002286474edb.js"></script>
<script src="polyfills.73e66b75888e8a86f685.js"></script>
<script src="main.4deb3029247017da53f3.js"></script>
</body>
</html>
我希望浏览器对外部 JavaScript 文件的内容进行散列,并将这些散列与在 Content-Security-Policy
标头的 script-src
属性中找到的散列进行比较(从而根据内容验证任何已交付 JavaScript 文件的完整性我的服务器已在 CSP 标头中列入白名单)。
Mozilla 在其 script-src
文档中声明。 注意最后一句话
来自:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src
脚本或样式的 sha256、sha384 或 sha512 哈希。此源的使用由用破折号分隔的两部分组成:用于创建散列的加密算法和脚本或样式的 base64 编码散列。生成哈希时,不要包含 或 标签,并注意大小写和空格很重要,包括前导或尾随空格。有关示例,请参阅不安全的内联脚本。在 CSP 2.0 中,这仅适用于内联脚本。 CSP 3.0 允许在外部脚本的 script-src 的情况下使用它。
答案 0 :(得分:1)
您提到的 MDN 文档只是流行信息,因此不包含详细信息。
根据 CSP3 spec,<script>
元素只有在包含与策略中的哈希匹配的完整性元数据时才被允许执行。
将 integrity= 属性添加到脚本标签中,如下所示:
<!-- These are Webpack generated scripts built with the Angular CLI -->
<script src="runtime.78e54b12002286474edb.js" integrity="sha256-...."></script>
<script src="polyfills.73e66b75888e8a86f685.js" integrity="sha256-...."></script>
<script src="main.4deb3029247017da53f3.js" integrity="sha256-...."></script>
和 'hash-value'
将开始工作。但是,不幸的是,在 Chrome only 中。 Safari 和 Firefox 尚未实现此功能。