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