提问人:Steffen Cole Blake 提问时间:10/22/2023 最后编辑:Steffen Cole Blake 更新时间:10/23/2023 访问量:76
文件的内容安全策略哈希似乎不起作用
Content Security Policy Hashes for Files Don't Seem to Work
问:
第 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-Not-Working-Example
https://github.com/SteffenBlake/Notes/tree/CSP-Not-Working-Example
它是一个静态提供 html、css 和 js 文件的 Asp.Net 应用程序。它在启动时执行初始计算以对 css 和 js 文件进行哈希处理,然后将它们添加到Content-Security-Policy
index.html
您可以运行应用程序并导航到并观察以 、 和形式生成的浏览器错误,并且所有错误都会被单独拒绝。https://localhost:8000
bootstrap.min.css
main.css
notes.js
您可以验证是否喜欢提供的文件哈希值是否确实正确。我什至从等地重新下载了每个文件,然后再次对它们进行了哈希处理,只是为了仔细检查 Asp.Net 在提供文件时可能没有修改文件,但是不,哈希值仍然是一样的。https://localhost:8000/bootstrap.min.css
对于那些报告浏览器给出文件被拒绝原因的提示的人,我上面发布的错误是完全复制粘贴的错误,其他文件也发生了类似的错误。bootstrap.min.css
充其量,这就是浏览器提供给我的所有信息。Firefox对此守口如瓶,提供的信息更少。
答:
我用这段代码来计算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 作为示例。
所以,我猜你缺乏跨界。
评论
<link>
在 CSP 级别 2 中,只能允许使用哈希的内联脚本/样式。在 CSP 级别 3 中,可以通过向 script-src 或 default-src 添加“strict-dynamic”来允许其他脚本。该规范没有提到您可以为 style-src 或 style-src-elem 执行此操作。
如果文件托管在同一源上,则可以在加载文件时改用 style-src-elem 中的“self”和 integrity 属性来启用 SubResource Integrity。
评论
script-src-elem
style-src-elem
评论