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

ASP.NET Core中CSP上报端点/cspreport POST返回404如何解决

问题根因

返回404的核心原因是路由配置不匹配,另外还有两处配置错误会导致后续功能异常,具体问题点如下:

  • 接口路由不匹配:你将CSPReport接口定义在HomeController中,未显式指定路由的情况下,默认MVC路由规则下该接口的实际访问路径是/Home/CSPReport,和CSP响应头中配置的上报地址/cspreport完全不一致,所有请求找不到对应端点就会返回404。
  • 媒体类型配置不一致:接口的[Consumes]特性配置的是application/cspreport,但JSON格式化器中添加支持的媒体类型是application/csp-report(中间多了连字符),即便路由修正后也会触发415不支持媒体类型错误。
  • CSP策略字符串拼接缺分号:img-src、font-src、connect-src三个指令末尾漏了分号,会导致后续指令拼接失效,无法正常触发拦截上报。
修复步骤

1. 修正CSP上报接口的路由和媒体类型配置

给Action显式绑定根路径路由,同时统一媒体类型配置:

[HttpPost("/cspreport")]
[Consumes("application/csp-report")]
public IActionResult CSPReport([FromBody] CspReportRequest cspReportRequest)
{
    // 生产环境建议替换为结构化日志存储,不要仅输出到控制台
    if (cspReportRequest?.CspReport != null)
    {
        Console.WriteLine($"CSP违规触发:文档地址{cspReportRequest.CspReport.DocumentUri},拦截资源地址{cspReportRequest.CspReport.BlockedUri},违规指令{cspReportRequest.CspReport.ViolatedDirective}");
    }
    return Ok();
}

2. 修正CSP响应头的策略拼接

补全所有指令末尾遗漏的分号,避免策略解析失效:

context.Response.Headers.Add(
"Content-Security-Policy-Report-Only",
"default-src 'self' ;" +
"script-src-elem 'self' ;" +
"script-src 'self' ;" +
"style-src-elem 'self' ;" +
"img-src 'self' ;" +
"font-src 'self' ;" +
"media-src 'self' ;" +
"frame-src 'self' ;" +
"connect-src 'self' ;" +
"object-src 'none' ;" +
"base-uri 'self' ;" +
"report-uri /cspreport ;"
);
验证方式
  • 启动项目后用Postman发送POST请求到https://localhost:44331/cspreport,请求头设置Content-Type: application/csp-report,请求体传入符合CspReportRequest结构的JSON,会正常返回200状态码。
  • 触发CSP违规后,浏览器上报请求会正常进入接口,控制台能输出对应的违规日志。

补充优化:现代浏览器已逐步废弃report-uri指令,正式环境建议同时配置report-to指令搭配上报端点使用,兼容性更好。

内容的提问来源于stack exchange,提问作者Code4Fun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:33:13