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

ASP Web应用集成CSP:nonce/sha*配置疑问咨询

关于CSP中'self'、sha*和nonce的使用说明

Great question! Let’s break this down clearly so you can get your CSP set up correctly without unnecessary complexity:

核心结论:站内非外部(同源)的JS/CSS文件,只需要'self'就够了

如果你的站内JS/CSS都是以外部文件形式存储在自己的服务器上(也就是同源资源,协议、域名、端口和当前站点一致),完全不需要为它们生成sha*哈希或者使用nonce。只需要在你的CSP指令里添加'self'到对应的源列表中:

  • 对于脚本:script-src 'self' [你的CDN域名];
  • 对于样式:style-src 'self' [你的CDN域名];

'self'的作用就是允许加载和执行来自当前源的所有资源,不管这些文件的内容哈希是什么——只要它们是从你的服务器(同源)加载的外部文件,CSP就会允许它们。

什么时候需要用sha*或者nonce?

只有当你不得不保留内联脚本或样式的时候才需要用到这两个机制。比如:

  • 你有动态生成的内联脚本(比如服务器渲染时插入的脚本),没法移到外部文件
  • 某些第三方工具要求必须使用内联代码,无法修改

这时候你有两个选择:

  1. sha*哈希:计算内联代码的sha256/sha384/sha512哈希,把它加到CSP的script-src或style-src里,比如:script-src 'self' 'sha256-abc123...';
  2. nonce:每次请求生成一个随机的nonce值,把它加到CSP头里(比如script-src 'nonce-random123';),同时给对应的内联脚本添加nonce="random123"属性

关于带integrity="sha*"的外部脚本(Bootstrap、jQuery等)

注意:Subresource Integrity(SRI)的integrity属性和CSP是两个独立的安全机制:

  • SRI是用来确保你加载的外部资源没有被篡改,验证资源内容和你预期的哈希一致
  • CSP是用来控制哪些域名的资源可以被加载

所以你不需要把这些外部脚本的integrity哈希加到CSP里,只需要在CSP的script-src中添加对应的CDN域名(比如https://cdn.jsdelivr.net、https://code.jquery.com)就可以让它们正常加载。如果你想更严格,可以结合strict-dynamic或者把特定资源的哈希加到CSP,但这通常不是必要的,除非你要限制只能加载特定版本的库。

总结

  • 站内外部文件:用'self'即可,无需sha/nonce
  • 内联代码(无法移除时):用sha*或nonce来允许执行
  • CDN资源:添加对应域名到CSP,无需处理它们的integrity哈希

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:01:07