文件的内容安全策略哈希似乎不起作用

Content Security Policy Hashes for Files Don't Seem to Work

提问人:Steffen Cole Blake 提问时间:10/22/2023 最后编辑:Steffen Cole Blake 更新时间:10/23/2023 访问量:76

问:

第 1 步:将 Bootstrap 4 的 SHA-384 完整性列表 css 文件的原始副本下载到本地 Web 项目: https://getbootstrap.com/docs/4.0/getting-started/download/

在撰写本文时,他们的哈希值被列为sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm

第 2 步:在提供的 .html 文件中引用它,如下所示:<head>

<link rel="stylesheet" href="bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" >

第 3 步:为 html 文件提供在其策略中包含该哈希值的标头:Content-Security-Policystyle-src-elem

Content Security Policy Header Response

预期结果: 文件的 sha-384 完整性哈希与 CSP 标头的哈希匹配,文件已加载并正常工作

实际结果(对于我测试过的所有浏览器):

Refused to load the stylesheet 'https://localhost:8000/bootstrap.min.css' because it violates the following Content Security Policy directive: "style-src-elem 'sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm' 'sha384-iFY+dCgFnB1nmk59trTsB2i1eTLIUAg+NhcRaA3bWZAqE9HK0ZSnZdOZ9NkoAs8S'".

我可以独立地验证哈希值对于文件是否确实正确,通过多种在线机制进行测试以生成 CSP 哈希值。

有人知道我在这里错过了什么吗?这应该有效,我是否错过了一个步骤或配置错误了什么?

我用来计算要检查的文件的哈希值的 C# 逻辑,它输出的哈希值与 Bootstrap 提供的哈希值相同:

private static string ComputeFileHash(IFileInfo file)
{
    using var stream = file.CreateReadStream();
    using var reader = new StreamReader(stream);
    using var sha384= SHA384.Create();

    var text = reader.ReadToEnd();
    var utf = Encoding.UTF8.GetBytes(text);
    var hash = sha384.ComputeHash(utf);
    return "'sha384-" + Convert.ToBase64String(hash) + "'";
}

我在这里有一个示例存储库设置,在分支上。CSP-Not-Working-Example

https://github.com/SteffenBlake/Notes/tree/CSP-Not-Working-Example

它是一个静态提供 html、css 和 js 文件的 Asp.Net 应用程序。它在启动时执行初始计算以对 css 和 js 文件进行哈希处理,然后将它们添加到Content-Security-Policyindex.html

您可以运行应用程序并导航到并观察以 、 和形式生成的浏览器错误,并且所有错误都会被单独拒绝。https://localhost:8000bootstrap.min.cssmain.cssnotes.js

您可以验证是否喜欢提供的文件哈希值是否确实正确。我什至从等地重新下载了每个文件,然后再次对它们进行了哈希处理,只是为了仔细检查 Asp.Net 在提供文件时可能没有修改文件,但是不,哈希值仍然是一样的。https://localhost:8000/bootstrap.min.css

对于那些报告浏览器给出文件被拒绝原因的提示的人,我上面发布的错误是完全复制粘贴的错误,其他文件也发生了类似的错误。bootstrap.min.css

充其量,这就是浏览器提供给我的所有信息。Firefox对此守口如瓶,提供的信息更少。

HTTP 加密 http-headers content-security-policy w3c

评论


答:

-1赞 Tore Nestenius 10/22/2023 #1

我用这段代码来计算CSP哈希,它对我有用:

    static void Main(string[] args)
    {
        string[] fileEntries = Directory.GetFiles(".");
        foreach (string fileName in fileEntries)
        {
            if (fileName.ToLower().EndsWith(".css") || fileName.ToLower().EndsWith("js"))
                GetChecksum(fileName);
        }
    }

    private static void GetChecksum(string file)
    {
        using (FileStream stream = File.OpenRead(file))
        {
            var sha = new SHA256Managed();
            byte[] checksum = sha.ComputeHash(stream);

            string r = System.Convert.ToBase64String(checksum);

            Console.WriteLine(file + $" \t integrity=\"sha256-{r}\"");

        }
    }
}

在 HTML 代码中,您需要使用它,使用 script-tag 作为示例。

所以,我猜你缺乏跨界。

评论

0赞 Steffen Cole Blake 10/22/2023
这并不能回答这个问题。这提供了与我的 C# 函数相同的输出,并且没有解决问题。
0赞 Tore Nestenius 10/22/2023
请看我更新的答案。
1赞 Tore Nestenius 10/22/2023
浏览器控制台还可以提供有关完整性被拒绝的原因的提示。
0赞 Steffen Cole Blake 10/22/2023
我在问题中发布的错误是浏览器提供的唯一输出,即它的完整复制粘贴。
0赞 Steffen Cole Blake 10/22/2023
这也没有跨源,文件是从同一个域提供的(请注意我的标签引用是同一个域。请完整阅读我的问题并对其进行审查,因为您的回答与正在讨论的问题正交。<link>
1赞 Halvor Sakshaug 10/23/2023 #2

在 CSP 级别 2 中,只能允许使用哈希的内联脚本/样式。在 CSP 级别 3 中,可以通过向 script-src 或 default-src 添加“strict-dynamic”来允许其他脚本。该规范没有提到您可以为 style-src 或 style-src-elem 执行此操作。

如果文件托管在同一源上,则可以在加载文件时改用 style-src-elem 中的“self”和 integrity 属性来启用 SubResource Integrity。

评论

0赞 Steffen Cole Blake 10/23/2023
这就是我开始怀疑的地方,所以简洁地说:CSP 级别 3 不支持 和 策略的哈希?如果是这样,也许应该提出一个错误,即当您将哈希传递到这两个策略时,浏览器目前不会抱怨无效的策略。预期行为应该是关于“未执行策略定义,忽略策略 xxxxxx...”的常见错误消息,但它“静默”失败,造成哈希值有效的印象。script-src-elemstyle-src-elem
0赞 Halvor Sakshaug 10/23/2023
CSP 级别 2(和 3 中没有“strict-dynamic”)中的哈希值用于允许内联脚本/样式,因此它是完全有效的,不应引起投诉。不过,使用“self”和 SubResource 完整性应该是一个可靠的解决方案。