直接答案: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 标签,不执行页面脚本,也不测试实际拦截效果。
方法:读响应头 + 内联脚本标签
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 情况 | 站点数 | 说明 |
|---|---|---|
| 没有 CSP | 14 | — |
| 只有非脚本指令 | 9 | frame-ancestors、block-all-mixed-content、upgrade-insecure-requests |
| script-src 宽泛 | 2 | E13、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-dynamic | 0 | — |
| unsafe-inline(无论是否限制来源) | 2 | E13、E17 |
没有 nonce/hash 意味着无法在保留现有内联脚本的同时收紧 script-src:一旦去掉 'unsafe-inline',这些内联脚本会被拦截。25 站共 151 个内联脚本(平均约 6 个,E04 单页 41 个),改造成本并不低。
对验收的启示
- 先区分“有 CSP”和“限制脚本”。 11 个 CSP 里 9 个只设非脚本指令;验收要写出具体指令,而不是只看有没有头。
- 不要用 * + unsafe-inline 交差。 E13、E17 的 script-src 允许任意来源与内联执行,XSS 防护基本失效。
- 逐步引入 nonce/hash。 本次 0 站使用;可从新页面或新模板开始,再迁移旧内联脚本。
- 控制内联脚本数量。 151 个内联脚本是收紧 CSP 的主要障碍;先把可外置的脚本移到文件。
- 把 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。
数据来源与口径
- 样本:第 4 期 25 个首页(同一批 sample_id)。
- 抓取:2026-11-08 16:41–16:43 Asia/Shanghai,串行,站间 0.5 秒,超时 15 秒。
- CSP:响应头优先,其次 meta;指令与 token 去引号后比较。
- 内联脚本:无 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 项离线单测。