diff --git a/site/build.mjs b/site/build.mjs index ca2f592..c7d3000 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'",