子资源完整性对内联 JavaScript 有用吗?

Posted

技术标签:

【中文标题】子资源完整性对内联 JavaScript 有用吗?【英文标题】:Is Subresource Integrity any useful for inline JavaScript? 【发布时间】:2017-12-24 23:15:06 【问题描述】:

我正在阅读有关 Subresource Integrity 的信息,并了解它用于验证外部文件。我想我在 MDN 或 W3C 中找不到任何对内联 javascript 的引用也就不足为奇了。

那么,是否可以肯定地说,与 SRI 相关的属性 integritycrossorigin 对于内联 JavaScript 完全没用?

【问题讨论】:

【参考方案1】:

我知道线程有点老,但是 W3C 现在支持完整性哈希检查。在以下情况下执行脚本:

src 已设置,完整性属性正确且符合 CSP 策略 src 未设置,完整性属性正确或符合 CSP 策略

Pull request

WebAppSec Subresource Integrity


编辑: 似乎实际上只有 Chrome 支持此功能

【讨论】:

【参考方案2】:

如果您正在寻找保护内联脚本文件,您可以在 CSP 标头中使用 nonce 属性并在脚本标签上指定该属性

nonce-base64-value 使用加密随机数(使用一次的数字)的特定内联脚本的白名单。服务器每次传输策略时都必须生成唯一的 nonce 值。提供一个不可猜测的随机数至关重要,因为绕过资源的策略是微不足道的。有关示例,请参见不安全的内联脚本。指定 nonce 会使现代浏览器忽略“unsafe-inline”,在没有 nonce 支持的情况下仍可以为旧版浏览器设置。

【讨论】:

【参考方案3】:

那么,是否可以肯定地说与 SRI 相关的属性 integritycrossorigin 对于内联 JavaScript 完全没用?

是的,因为这些属性只对具有src 属性的script 元素有用:

https://html.spec.whatwg.org/multipage/scripting.html#attr-script-integrity

integrity 属性表示该元素负责的请求的完整性元数据。值为文本。嵌入模块脚本或未指定 src 属性时,不得指定 integrity 属性。 [SRI]

正如问题中所述,MDN 中的描述也明确了这一点:

https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity

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

【讨论】:

【参考方案4】:

是的,可以肯定地说,因为当<script> 没有“src”属性时,<script> 标记的integrity 属性将被忽略。只有通过单独的 HTTP 请求获取资源时,SRI 才会出现。

【讨论】:

以上是关于子资源完整性对内联 JavaScript 有用吗?的主要内容,如果未能解决你的问题,请参考以下文章

子资源完整性真的有效吗?

Firebase 上的子资源完整性安全标头

PHP 中的子资源完整性和缓存破坏技术

搜索并移动对内联引用的引用

寻求对内联命名空间的澄清

关于marginpadding 对内联元素的影响