子资源完整性和随机数值



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

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

谢谢

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

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

随机数-*加密随机数(仅使用一次(以将脚本列入白名单。服务器每次传输 政策。提供无法猜测的随机数至关重要 绕过资源的策略在其他方面是微不足道的。这用于 与脚本标记随机数属性结合使用。例如 nonce-DhcnhD3khTMePgXwdayK9BsMqXjhguVV

因此,假设您的应用程序设置了一个像script-src'nonce-r4nd0m';这样的Content-Security-Policy标头,那么good.com/good.js处的脚本将被执行,因为 nonce 值相同。

<script nonce="r4nd0m" src="//good.com/good.js">

如果攻击者破坏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">

攻击者修改good.js,使修改脚本的结果哈希变为Y。浏览器不运行脚本,因为计算的哈希 (Y( 和所需的哈希 (X( 不匹配。

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

<script nonce="r4nd0m" integrity="sha384-X" src="//good.com/good.js">

最新更新