ASP.NET核心脚本标记帮助程序asp-fallback-src无法通过完整性检查

时间:2018-05-30 17:16:42

标签: asp.net-core asp.net-core-mvc asp.net-core-2.0

当我使用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手动复制以使它们匹配,因为未来更新需要额外的维护工作。我想使用包管理器。

3 个答案:

答案 0 :(得分:3)

目前,没有开箱即用的解决方案,目前尚不清楚何时实施(见here)。 此外,我也有这个问题,我找不到优雅的解决方法。 不过,我们有两种选择:

  1. 使用其source code实施自己的ScriptTagHelper,并从FallbackBlock中排除integrity属性。
  2. 不要使用ScriptTagHelper并手动编写它产生的内容,但FallbackBlock中的integrity属性除外:
  3. <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 LinkTagHelperScriptTagHelper获得了新的布尔属性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)

选项1

您可以停止使用CDN并从NPM包中提供文件。您可以在Cloudflare等服务后面运行您的网站,该服务可以为您全局缓存文件。

选项2

在构建中添加一个步骤(webpack,gulp或其他),直接从CDN复制文件。我不确定为什么他们的文件不是二进制相等。

选项3

如果上述任一选项太难,您可以停止使用SRI。这是成本与价值等式。只有你可以决定是否值得努力。我认为你不能根据它是本地文件还是远程文件来切换哈希值。