当我使用ASP.NET Core Script Tag Helper测试回退到本地文件时,我收到以下错误:
无法在'integrity'属性中找到有效的摘要 资源“http://localhost:48888/js/jquery.min.js”与计算 SHA-256完整性'oozPintQUive6gzYPN7KIhwY / B + d8 + 5rPTxI1ZkgaFU ='。该 资源已被阻止。
本地文件的文本等于CDN版本,但不等于二进制文件。这成为一个问题,因为完整性哈希不仅与主源进行比较,还与回退源进行比较,并且无法通过检查,因为它生成了不同的哈希。
以下是一个例子:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"
asp-fallback-src="~/js/jquery.min.js"
asp-fallback-test="window.jQuery"
crossorigin="anonymous"
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=">
</script>
只要浏览器可以访问Google的CDN,这项工作正常。但是,如果您将源更改为错误值,例如查找不存在的版本,例如“3.9.9”,这会导致它回退到本地文件。该本地文件将无法加载,因为它们不是二进制相等(不同的哈希值)。
理想情况下,完整性检查不会应用于本地文件,因为我们信任我们控制下的本地文件。另一种方法是我们可以为本地回退定义一个不同的哈希值。
这些选项中的任何一个都可用吗?如果没有,还有另一种解决方法吗?我试图避免从CDN手动复制以使它们匹配,因为未来更新需要额外的维护工作。我想使用包管理器。
答案 0 :(得分:3)
目前,没有开箱即用的解决方案,目前尚不清楚何时实施(见here)。 此外,我也有这个问题,我找不到优雅的解决方法。 不过,我们有两种选择:
ScriptTagHelper
,并从FallbackBlock中排除integrity
属性。ScriptTagHelper
并手动编写它产生的内容,但FallbackBlock中的integrity
属性除外:<script
src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"
crossorigin="anonymous"
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=">
</script>
<script>(window.jQuery||document.write("\u003Cscript src=\u0022\/js\/jquery.min.js\u0022 crossorigin=\u0022anonymous\u0022 \u003E\u003C\/script\u003E"));</script>
答案 1 :(得分:3)
从2018年12月起,最近发布的 ASP.NET Core 2.2.0 都LinkTagHelper
和ScriptTagHelper
获得了新的布尔属性asp-suppress-fallback-integrity
。设置为true时,后备资源将绕过完整性检查。
当CDN和NPM的二进制分布不同时(例如Font Awesome 5的情况),这是必需的。
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css" integrity="sha384-UHRtZLI+pbxtHCWp1t77Bi1L4ZtiqrqD80Kn4Z8NTSRyMA2Fd33n5dQ8lWUE00s/" crossorigin="anonymous"
asp-fallback-href="~/lib/font-awesome/css/all.min.css"
asp-fallback-test-class="fab" asp-fallback-test-property="font-style" asp-fallback-test-value="normal"
asp-suppress-fallback-integrity="true" />
就我个人而言,对本地资源进行完整性检查没有任何好处。它维护成本高,并且具有使故障恢复无效的高风险,这是灾难性的,并且无需复杂的测试就可以模拟很难发现的每个新版本的失败CDN。因此,我更喜欢将此属性添加到所有资源中。
答案 2 :(得分:1)
您可以停止使用CDN并从NPM包中提供文件。您可以在Cloudflare等服务后面运行您的网站,该服务可以为您全局缓存文件。
在构建中添加一个步骤(webpack,gulp或其他),直接从CDN复制文件。我不确定为什么他们的文件不是二进制相等。
如果上述任一选项太难,您可以停止使用SRI。这是成本与价值等式。只有你可以决定是否值得努力。我认为你不能根据它是本地文件还是远程文件来切换哈希值。