安全响应头不是安全代码的替代品,但它们让浏览器强制实施有用的边界。策略应描述实际被服务的页面,而不是从另一个项目复制来的泛型模板。
从资源图开始
如果站点只提供 HTML、本地样式表、一个 favicon、没有任何可执行 JavaScript,那么一条窄策略是可理解的:
Content-Security-Policy: default-src 'self'; base-uri 'self'; form-action 'none'; frame-ancestors 'none'; object-src 'none'; script-src 'none'; style-src 'self'; img-src 'self' data:
script-src 'none' 只有在站点不需要可执行脚本时才是正确的选择。加入搜索、评论或统计标签会改变资源图,并应触发一次有意识的策略复核。
增加传输与嵌套保护
对仅 HTTPS 的站点,下列响应头是常见起点:
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(), usb=()
只有当每个子域名都准备好提供 HTTPS 时才启用带 includeSubDomains 的 HSTS。响应头是与未来部署的契约,而不只是扫描器里的一个分数。
检查行为,而不只是存在
请求一个正常页面、一个缺失页面与一个静态资源。错误响应应携带与成功响应同样重要的安全响应头。还要确认压缩与缓存不会改变内容类型,也不会暴露内部路径。
本站的Caddy 示例只是一个起点,不是普适策略。请根据你自己的部署调整主机名、证书处理与应用路由。
来源
- MDN: Content Security Policy guide,CSP 指令名称与语法,已核验 2026-08-22。
- MDN:
Strict-Transport-Security,HSTS 指令与部署注意事项,已核验 2026-08-22。 - Caddy
header指令,响应头操作指令,已核验 2026-08-22。