目前,对于我们的 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">