用途
Security Headers 是一个用于为每个 HTTP 响应添加 HTTP 安全响应头的技能。其定位是“零额外成本、高收益”的防护:通过统一设置安全头,预防整类攻击。规则明确要求:每个 HTTP 响应都必须包含安全头,没有例外。
主要能力与必需响应头
技能列出了必须配置的响应头及其防禦目标和推荐值:
- Strict-Transport-Security:防止降级攻击与 SSL 剥离,值
max-age=31536000; includeSubDomains; preload - Content-Security-Policy:防 XSS、数据注入、点击劫持,具体值见下方 CSP 部分
- X-Content-Type-Options:防 MIME 嗅探攻击,值
nosniff - X-Frame-Options:防点击劫持,值
DENY或SAMEORIGIN - Referrer-Policy:防向第三方泄露 URL,值
strict-origin-when-cross-origin - Permissions-Policy:防未经授权访问设备 API,值
camera=(), microphone=(), geolocation=() - X-XSS-Protection:旧的 XSS 过滤器,值
0(禁用,因为 CSP 更好)
各框架实现
技能提供四种框架的可直接复制代码。
Cloudflare Workers
定义一个 addSecurityHeaders(response: Response): Response 函数,基于原响应头创建 Headers,依次设置 HSTS、X-Content-Type-Options、X-Frame-Options、Referrer-Policy、Permissions-Policy 和 CSP,并删除泄露服务器信息的 Server 与 X-Powered-By,最后用这些头重建并返回 Response。默认导出对象的 fetch 方法先调用 handleRequest,再传入 addSecurityHeaders。
Express.js / Node.js
提供两种方式:
方式 1(推荐):使用 helmet。示例配置 contentSecurityPolicy.directives,包含 defaultSrc、scriptSrc、styleSrc、imgSrc、connectSrc、frameAncestors,并设置 hsts: { maxAge: 31536000, includeSubDomains: true, preload: true }。
方式 2:手写中间件(无依赖)。在 app.use 中通过 res.setHeader 设置各项安全头,并调用 res.removeHeader('X-Powered-By'),最后 next()。
Next.js
在 next.config.js 中定义 securityHeaders 数组(HSTS、X-Content-Type-Options、X-Frame-Options、Referrer-Policy、Permissions-Policy),并通过导出的 async headers() 返回 source: '/(.*)' 与对应 headers。
Laravel / PHP
创建 app/Http/Middleware/SecurityHeaders.php,在 handle 方法中对 $response->headers 设置各项安全头,并移除 X-Powered-By 与 Server。然后在 app/Http/Kernel.php 的 $middleware 数组中注册该中间件。
Content-Security-Policy(CSP)指南
CSP 是最复杂的头。原则是从严格开始,仅在需要时放宽。技能给出四种配置示例:
- 严格(仅 API、无前端):
default-src 'none'; frame-ancestors 'none' - 标准(带 CDN 资源的 SPA):
default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; connect-src 'self' https://api.yourapp.com; font-src 'self' https://fonts.gstatic.com; frame-ancestors 'none' - 含第三方脚本(分析、支付):允许
https://js.stripe.com、https://www.googletagmanager.com等脚本源,connect-src允许 Stripe 与 Google Analytics,并用frame-src https://js.stripe.com - 仅报告模式(先测试再强制):
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report
需要移除的响应头
技能提醒移除会泄露技术栈的信息头:
Server: nginx/1.21.0→ 移除X-Powered-By: Express→ 移除X-AspNet-Version: 4.0.30319→ 移除X-AspNetMvc-Version: 5.2→ 移除
验证方法
技能给出验证途径:使用 curl 执行 curl -I https://yoursite.com 检查响应头;或在浏览器 DevTools → Network 标签 → Response Headers 中查看。
PDPA 2024 相关性
安全响应头属于 PDPA 2024 下的“合理安全措施”(langkah keselamatan yang munasabah)。缺失响应头导致 XSS 或点击劫持攻击并引发数据泄露,可能构成 Seksyen 5(1) 下的过失。