如何配置安全的HTTP头?

wen 网络安全 2

本文目录导读:

如何配置安全的HTTP头?

  1. 核心安全HTTP头清单
  2. 配置示例(按服务器类型)
  3. Content-Security-Policy (CSP) 配置要点
  4. 检查与调试工具
  5. 注意事项与常见误区
  6. 总结建议

配置安全的HTTP头是提升Web应用安全性的重要手段,可以有效防御XSS、点击劫持、MIME类型嗅探等常见攻击,以下是核心安全HTTP头的配置指南及示例(适用于Nginx、Apache等常见服务器)。


核心安全HTTP头清单

HTTP头 作用 推荐值
Strict-Transport-Security 强制HTTPS连接,防止SSL剥离 max-age=31536000; includeSubDomains; preload
X-Content-Type-Options 防止浏览器MIME类型嗅探 nosniff
X-Frame-Options 防止点击劫持(页面被嵌入iframe) DENYSAMEORIGIN
X-XSS-Protection 启用浏览器XSS过滤器(部分现代浏览器已废弃,但仍推荐兼容) 1; mode=block
Content-Security-Policy 控制资源加载来源,防御XSS和数据注入 按需配置(见下文示例)
Referrer-Policy 控制referrer信息的发送 strict-origin-when-cross-origin
Permissions-Policy 限制浏览器API权限(如摄像头、麦克风) camera=(), microphone=(), geolocation=()
Cache-Control 控制缓存策略,防止敏感信息缓存 no-store, no-cache, must-revalidate (对动态/敏感页面)

配置示例(按服务器类型)

Nginx (在 serverlocation 块中添加)

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; object-src 'none'; frame-ancestors 'none'; base-uri 'self'" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()" always;

Apache (在 .htaccesshttpd.conf 中添加)

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "DENY"
Header always set X-XSS-Protection "1; mode=block"
Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; object-src 'none'; frame-ancestors 'none'; base-uri 'self'"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()"

IIS (通过 web.config)

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains; preload" />
      <add name="X-Content-Type-Options" value="nosniff" />
      <add name="X-Frame-Options" value="DENY" />
      <add name="X-XSS-Protection" value="1; mode=block" />
      <add name="Content-Security-Policy" value="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; object-src 'none'; frame-ancestors 'none'; base-uri 'self'" />
      <add name="Referrer-Policy" value="strict-origin-when-cross-origin" />
      <add name="Permissions-Policy" value="camera=(), microphone=(), geolocation=(), payment=()" />
    </customHeaders>
  </httpProtocol>
</system.webServer>

Node.js (Express)

const helmet = require('helmet');
app.use(helmet({
  contentSecurityPolicy: {
    directives: {
      defaultSrc: ["'self'"],
      scriptSrc: ["'self'"],
      styleSrc: ["'self'", "'unsafe-inline'"],
      imgSrc: ["'self'", "data:"],
      objectSrc: ["'none'"],
      frameAncestors: ["'none'"],
      baseUri: ["'self'"]
    }
  },
  referrerPolicy: { policy: 'strict-origin-when-cross-origin' },
  // 其他选项默认即可
}));
// 注:helmet 默认已包含大部分安全头,以上为定制示例

Content-Security-Policy (CSP) 配置要点

CSP配置需要根据实际资源加载情况调整,避免误伤,典型配置模板:

Content-Security-Policy:
  default-src 'self';                          # 默认只信任同源
  script-src 'self' https://trusted.cdn.com;   # 允许特定CDN的脚本
  style-src 'self' 'unsafe-inline';            # 允许内联样式(如需)
  img-src 'self' data: https://images.example.com;
  font-src 'self' https://fonts.gstatic.com;
  connect-src 'self' https://api.example.com;  # XMLHttpRequest、WebSocket等
  frame-ancestors 'none';                      # 禁止被嵌入任何iframe
  base-uri 'self';                             # 限制<base>标签
  form-action 'self';                          # 限制表单提交目标
  upgrade-insecure-requests;                   # 自动升级HTTP到HTTPS(可选)

重要:CSP配置应逐步放宽,先在report-only模式下测试(Content-Security-Policy-Report-Only),确认无违规后再启用强制策略。


检查与调试工具

  • 在线检查:访问 securityheaders.com,输入你的域名获得评分和详细报告。
  • 浏览器开发者工具:在“网络”标签查看响应头,确认所有头已正确返回。
  • curl命令
    curl -I https://yourdomain.com

注意事项与常见误区

  1. 不要直接复制生产:CSP策略需根据实际的前端资源(如第三方CDN、内联脚本)定制,否则可能导致页面功能失效。
  2. HSTS预加载:如果申请HSTS预加载,需确保全站HTTPS且无子域名降级。
  3. X-XSS-PROTECTION已废弃:Chrome已移除对X-XSS-Protection的支持,但保留以兼容旧浏览器。
  4. Permissions-Policy:相比Feature-Policy(已弃用),使用新规范Permissions-Policy
  5. 避免过度限制:如网站使用了iframe(如支付页面),X-Frame-Options应设为SAMEORIGIN而非DENY
  6. 缓存风险:对静态资源可设置Cache-Control: public, max-age=31536000,但对敏感页面(如后台、个人资料)必须禁止缓存。

总结建议

  • 最低安全配置:先启用 Strict-Transport-SecurityX-Content-Type-OptionsX-Frame-OptionsReferrer-Policy,这些几乎不会影响功能。
  • 逐步引入CSP:从Content-Security-Policy-Report-Only开始,收集违规报告,再转为强制策略。
  • 定期审计:使用自动化工具(如 Mozilla Observatory、Nmap NSE脚本)定期检查安全头配置。

正确配置后,可显著提升网站对XSS、点击劫持、中间人攻击等威胁的防御能力。

抱歉,评论功能暂时关闭!