You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

文件Content Security Policy哈希验证失效问题求助

配置Content Security Policy(CSP)时资源加载被拒绝的问题

我在配置Content Security Policy(CSP)时遇到问题,操作流程如下:

  • 步骤1:下载Bootstrap 4官方标注SHA-384完整性哈希的CSS文件到本地Web项目,当前哈希为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策略。

预期文件可正常加载,但实际所有测试浏览器均拒绝加载,提示违反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'".

我已通过多种在线工具及自行编写的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) + "'";
}

我搭建了Asp.Net示例仓库(分支CSP-Not-Working-Example),应用启动时计算文件哈希并添加到CSP头,但bootstrap.min.css、main.css、notes.js均被拒绝加载。重新下载服务器文件验证哈希仍正确,浏览器未给出更多错误信息,请问我遗漏了什么配置或步骤?


问题排查与解决方案

1. 哈希计算的编码与流读取方式错误

你的C#代码通过StreamReader读取文本再转UTF8字节,会导致两个问题:一是文件的换行符(Windows CRLF/Unix LF)可能被自动转换,二是如果文件带BOM头,会被StreamReader过滤,最终计算的哈希和浏览器实际接收的原始字节哈希不一致。

修改代码直接读取文件原始字节流:

private static string ComputeFileHash(IFileInfo file)
{
    using var stream = file.CreateReadStream();
    using var sha384 = SHA384.Create();
    var hash = sha384.ComputeHash(stream);
    return "'sha384-" + Convert.ToBase64String(hash) + "'";
}

2. 静态资源压缩导致内容变更

Asp.Net默认可能开启了Gzip/Brotli压缩,压缩后的资源内容和原文件完全不同,哈希自然不匹配。

  • 排查:临时关闭静态资源压缩(在web.config或中间件中禁用),测试是否能正常加载。
  • 解决:如果需要保留压缩,需分别计算原文件和压缩后文件的哈希,全部添加到CSP策略中。

3. CSP指令的冲突与覆盖

  • 检查是否存在多个CSP头(比如Web.config、中间件、IIS设置重复添加),实际生效的策略可能和你配置的不一致。
  • 确认是否同时配置了style-src指令:style-src是style-src-elem的 fallback 规则,如果style-src的限制更严格,会覆盖style-src-elem的配置。需确保style-src也包含对应哈希,或者只使用style-src-elem并明确禁用fallback。

4. 中间件或编辑器修改了资源内容

  • 检查是否有Asp.Net中间件对静态资源进行了自动修改(比如添加版权注释、格式化代码)。
  • 确认本地文件是否被编辑器自动添加了BOM头或修改了换行符,导致上传到服务器的文件和你计算哈希的文件不一致。

内容的提问来源于stack exchange,提问作者Steffen Cole Blake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 06:42:49