子资源完整性和随机数值

Use*_*842 3 html security

目前,对于我们的 Web 应用程序,我们正在生成nonce附加到script标签的值。我最近发现了子资源完整性,并考虑到我们正在使用 CDN(如大多数示例参考),我很好奇这是否是我的 Web 应用程序应该使用的东西。

是否存在同时使用nonce和属性的情况?integrity这个比那个好吗?或者,它们是否完全支持多个用例?

谢谢

Mai*_*ake 5

它们支持不同的用例,您可以同时使用两者。

Nonce 指示浏览器仅执行<script>在 CSP 标头中设置了相同 nonce 值的元素。

nonce- * 用于白名单脚本的加密随机数(仅使用一次)。服务器每次传输策略时都必须生成唯一的随机数值。提供一个无法猜测的随机数至关重要,否则绕过资源的策略是微不足道的。这与脚本标签随机数属性结合使用。例如随机数-DhcnhD3khTMePgXwdayK9BsMqXjhguVV

因此,假设您的应用程序设置了一个Content-Security-Policy标头,script-src'nonce-r4nd0m'; 然后将执行脚本,good.com/good.js因为随机数值相同。

<script nonce="r4nd0m" src="//good.com/good.js">
Run Code Online (Sandbox Code Playgroud)

good.com如果攻击者妥协并向 中添加恶意脚本会发生什么good.js?您的 Web 应用程序仍然允许执行该脚本,因为检查是针对随机数值而不是脚本内容进行的。因此,您还需要确保 的内容good.js保持不变。

这里integrity就涉及到属性了。它实现子资源完整性,并告诉浏览器仅当计算出的哈希值与存储在属性中的哈希值匹配时才运行资源integrity

子资源完整性 (SRI) 是一项安全功能,使浏览器能够验证它们获取的资源(例如,从 CDN)是否在没有意外操作的情况下交付。它的工作原理是允许您提供所获取的资源必须匹配的加密哈希。

因此,假设您第一次将脚本包含在 Web 应用程序中,脚本的内容是安全的并且integrity值为X。然后您添加integrity="sha384-X"到脚本元素,如下所示。

 <script src="//good.com/good.js"
        integrity="sha384-X">
Run Code Online (Sandbox Code Playgroud)

攻击者进行修改good.js,使修改后的脚本的哈希值变为Y。浏览器不会运行该脚本,因为计算出的哈希值 ( Y) 与所需的哈希值 ( X) 不匹配。

我认为你可以像这样将两者结合起来。

<script nonce="r4nd0m" integrity="sha384-X" src="//good.com/good.js">
Run Code Online (Sandbox Code Playgroud)