From 6f494d818e6b1bad47ca092236291f00e3a94a26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?AI=E4=B8=8D=E6=AD=A2=E8=AF=AD?= <12096460+jnMetaCode@users.noreply.github.com> Date: Sat, 20 Jun 2026 05:56:04 +0800 Subject: [PATCH] =?UTF-8?q?feat(site):=20=E6=8E=A5=E5=85=A5=20Google=20Ana?= =?UTF-8?q?lytics=20(gtag.js,=20G-L02QK4EVDL)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在每页 加入 gtag.js(异步加载器 + 内联 config)。 同步放行严格 CSP(否则 GA 被拦): - script-src 增加 https://www.googletagmanager.com(加载器);内联 config 块由 CSP hash 收集器自动加白名单 - connect-src 增加 google-analytics / analytics.google / googletagmanager (上报埋点) - img-src 增加 google-analytics / googletagmanager(beacon) 验证:重建 42 页;GA 代码在 head;CSP 含上述域名;全站 126 处内联脚本 hash 全命中 CSP(0 缺失,站点不被打断、GA 内联可执行)。 --- site/build.mjs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/site/build.mjs b/site/build.mjs index ca2f592d..c7d3000c 100644 --- a/site/build.mjs +++ b/site/build.mjs @@ -310,6 +310,9 @@ function layout({ lang, base, title, desc, body, langHref, extraHead = '' }) { + + + ${esc(title)} @@ -570,15 +573,18 @@ function build() { }; collectScriptHashes(DIST); - // 严格 CSP:脚本仅允许 'self' + 本站内联脚本的 hash;样式仅 'self'(无内联样式); - // 禁用插件/内联事件;锁死 base-uri 与 frame 祖先(防点击劫持)。外链均为 导航,不受影响。 + // 严格 CSP:脚本仅允许 'self' + 本站内联脚本的 hash(含 GA 内联配置块,自动收集); + // 样式仅 'self';禁用插件/内联事件;锁死 base-uri 与 frame 祖先。 + // Google Analytics (gtag) 需放行 googletagmanager(加载器)与 analytics(上报)域名。 + const GA_SCRIPT = 'https://www.googletagmanager.com'; + const GA_CONNECT = 'https://www.google-analytics.com https://*.google-analytics.com https://*.analytics.google.com https://www.googletagmanager.com'; const csp = [ "default-src 'self'", - "script-src 'self' " + [...scriptHashes].join(' '), + "script-src 'self' " + GA_SCRIPT + ' ' + [...scriptHashes].join(' '), "style-src 'self'", - "img-src 'self' data:", + "img-src 'self' data: https://www.google-analytics.com https://www.googletagmanager.com", "font-src 'self'", - "connect-src 'self'", + "connect-src 'self' " + GA_CONNECT, "object-src 'none'", "base-uri 'self'", "frame-ancestors 'none'",