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

问题描述 投票:0回答:1

第 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-Policy
标头,其中在其
style-src-elem
策略中包含该哈希值:

预期结果: 文件的 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) + "'";
}
http encryption http-headers content-security-policy w3c
1个回答
0
投票

我用这段代码来计算 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}\"");

        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.