直接答案:25 个首页中,11 个返回 Content-Security-Policy、14 个没有。但真正限制脚本的站点是 0 个:9 个只设了 frame-ancestors、block-all-mixed-content 或 upgrade-insecure-requests;2 个(E13、E17)的 script-src 用 * + 'unsafe-inline' + 'unsafe-eval'。全部 25 站 0 个 nonce/hash/strict-dynamic;151 个内联脚本 0 个带 nonce。

本文只读首页响应头与内联 script 标签,不执行页面脚本,也不测试实际拦截效果。

25
首页
11
返回 CSP
9
仅非脚本指令
2
script-src 宽泛
0
真正限制脚本
151
内联脚本

方法:读响应头 + 内联脚本标签

2026-11-08 16:41–16:43,对第 4 期 25 个首页各发一次 GET(超时 15 秒),读取 Content-Security-Policy(以及 Report-Only 与 meta 形式),解析指令与 token;同时统计 <script> 内联标签数量与 nonce 属性。页面脚本不执行。

项判定边界
有 CSP响应头或 meta 出现 Content-Security-Policy不判断浏览器是否强制
真正限制脚本存在 script-src/default-src,且无 unsafe-inline/nonce/hash不测试实际拦截
仅非脚本指令只有 frame-ancestors/mixed-content/upgrade 等脚本不受该策略约束
内联脚本无 src 的 script 标签动态插入不计

结果:11 个 CSP,9 个只设非脚本指令

CSP 情况站点数说明
没有 CSP14—
只有非脚本指令9frame-ancestors、block-all-mixed-content、upgrade-insecure-requests
script-src 宽泛2E13、E17:* + unsafe-inline + unsafe-eval
真正限制脚本0—

11 个 CSP 里,9 个只解决防嵌入、混合内容或协议升级,不涉及脚本来源;剩下 2 个虽然写了 script-src,却用 * 允许任意来源、用 'unsafe-inline' 允许内联、用 'unsafe-eval' 允许字符串求值——这更接近“写了一个 CSP”,而不是“限制脚本”。

nonce/hash:25 站全部为 0

脚本白名单机制站点数说明
nonce-*0—
sha256/sha384 哈希0—
strict-dynamic0—
unsafe-inline(无论是否限制来源)2E13、E17

没有 nonce/hash 意味着无法在保留现有内联脚本的同时收紧 script-src:一旦去掉 'unsafe-inline',这些内联脚本会被拦截。25 站共 151 个内联脚本(平均约 6 个,E04 单页 41 个),改造成本并不低。

对验收的启示

  1. 先区分“有 CSP”和“限制脚本”。 11 个 CSP 里 9 个只设非脚本指令;验收要写出具体指令,而不是只看有没有头。
  2. 不要用 * + unsafe-inline 交差。 E13、E17 的 script-src 允许任意来源与内联执行,XSS 防护基本失效。
  3. 逐步引入 nonce/hash。 本次 0 站使用;可从新页面或新模板开始,再迁移旧内联脚本。
  4. 控制内联脚本数量。 151 个内联脚本是收紧 CSP 的主要障碍;先把可外置的脚本移到文件。
  5. 把 CSP 纳入安全验收。 至少检查 default-src/script-src、unsafe-inline/unsafe-eval、nonce/hash 与 Report-Only;参考首页安全响应头 pilot。企业官网验收可参考网站建设服务。

局限

  • 不执行脚本:不验证浏览器是否真的拦截,也不测 Report-Only 的实际上报。
  • 只首页:其他路径可能使用不同 CSP;meta 形式只匹配常见写法。
  • 动态插入不计:由脚本插入的内联 script 不在 HTML 中。
  • 单次快照:2026-11-08 16:41–16:43;CDN 或配置变更会改变结果。
  • 25 站 pilot:不外推行业。

数据与复算

匿名数据:equipment-homepage-csp-2026.csv(25 行 × 13 列:CSP 是否存在、Report-Only、script 指令、unsafe-inline、nonce/hash、内联脚本数、nonce 数、分类、时间)。仓库内为 docs/research/2026-11-homepage-csp.csv。

解析:scripts/csp_inline_probe.py;单元测试 scripts/test_content_csp_inline.py(16 项,无网络)。运行:

python -m unittest scripts.test_content_csp_inline

配套:首页安全响应头 pilot、首页阻塞资源 pilot、首页 HTTPS 证书与 TLS pilot。

数据来源与口径

  1. 样本:第 4 期 25 个首页(同一批 sample_id)。
  2. 抓取:2026-11-08 16:41–16:43 Asia/Shanghai,串行,站间 0.5 秒,超时 15 秒。
  3. CSP:响应头优先,其次 meta;指令与 token 去引号后比较。
  4. 内联脚本:无 src 的 script 标签;统计总数与带 nonce 的数量。

常见问题

有 CSP 就等于安全吗?

不等于。本次 9 个站点的 CSP 只设 frame-ancestors、block-all-mixed-content 或 upgrade-insecure-requests,不限制脚本。

script-src 用 * + unsafe-inline 有什么问题?

它允许任意来源的脚本和内联脚本执行,XSS 防护基本失效;unsafe-eval 还允许字符串求值。

nonce/hash 为 0 说明什么?

没有站点用 nonce 或 hash 白名单;要在保留现有内联脚本的同时收紧 CSP,通常需要先改模板。

151 个内联脚本算多吗?

25 站平均约 6 个,E04 单页 41 个;内联脚本越多,收紧 script-src 的改造成本越高。

25 个站点能代表行业吗?

不能。这是第 4 期同一批装备企业官网的 pilot,只描述这 25 个首页。

数据能复核吗?

可以。公开 CSV 25 行 × 13 列;scripts/csp_inline_probe.py 有 16 项离线单测。

关于作者

凌壹信息Official(交付团队),负责企业网站、品牌与智能制造项目的需求梳理、方案与验收协作。本文只解析首页 CSP 与内联脚本标签,不执行脚本、不验证实际拦截或上报,也不构成对任何站点的安全结论;25 站 pilot,不外推行业。

canonical 缺失是首页的常见缺口

25 站:9 个 canonical、16 个缺失;8 个 og:url。

预约内容验收方案