HTTP安全响应头配置详解:HSTS、CSP、X-Frame-Options

a
admin
作者
2026-07-25
发布日期
约 15 分钟
阅读时间

最近后台有用户问:我的网站装了SSL证书,为什么安全评分还是不高?检查发现是HSTS、CSP这些HTTP安全响应头没配置。这些头部虽然不直接加密数据,但能大幅提升网站安全性。这篇就把几个关键的安全响应头详细讲一下。

什么是HTTP安全响应头

HTTP安全响应头是服务器返回给浏览器的特殊指令,告诉浏览器如何安全地处理页面内容。配置在Web服务器(Nginx/Apache)的响应头里,浏览器收到后会按规则执行。

常见的HTTP安全头有:

  • HSTS:强制HTTPS
  • CSP:内容安全策略
  • X-Frame-Options:防点击劫持
  • X-Content-Type-Options:防MIME嗅探
  • Referrer-Policy:控制Referer信息
  • Permissions-Policy:权限策略

HSTS:强制HTTPS

作用:告诉浏览器”这个域名以后必须用HTTPS访问”,即使用户输入HTTP也自动跳转。防止SSL Strip降级攻击。

配置示例

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

参数说明

  • max-age=31536000:有效期1年(秒)
  • includeSubDomains:包含所有子域名
  • preload:允许加入浏览器HSTS预加载列表

Nginx配置

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

Apache配置

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

注意事项

  • 确保证书有效期内不会过期,否则用户无法访问
  • max-age从小值开始(如300),测试没问题再调大
  • 加入preload列表前要确认所有子域名都支持HTTPS

CSP:内容安全策略

作用:限制网页能加载哪些资源(JS、CSS、图片、字体等),防止XSS攻击和数据外泄。是防御XSS最有效的手段之一。

配置示例

Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' https://fonts.gstatic.com; connect-src 'self'; frame-ancestors 'none';

关键指令

  • default-src 'self':默认只允许同源资源
  • script-src:JavaScript来源限制
  • style-src:CSS来源限制
  • img-src:图片来源限制
  • frame-ancestors 'none':禁止被iframe嵌套(等同X-Frame-Options: DENY)
  • connect-src:AJAX请求限制

Nginx配置

add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' https://fonts.gstatic.com; frame-ancestors 'none';" always;

注意事项

  • 先用 Content-Security-Policy-Report-Only 模式测试,不影响实际访问
  • 'unsafe-inline''unsafe-eval' 会降低安全性,能不用就不用
  • 上线前用浏览器Console检查CSP违规报告

X-Frame-Options:防点击劫持

作用:禁止网页被iframe嵌套,防止攻击者用透明iframe覆盖在你的网页上诱导用户点击。

可选值

  • DENY:完全禁止被嵌套
  • SAMEORIGIN:只允许同源页面嵌套
  • ALLOW-FROM uri:允许指定来源嵌套(已废弃,用CSP替代)

推荐配置

X-Frame-Options: SAMEORIGIN

Nginx配置

add_header X-Frame-Options "SAMEORIGIN" always;

Apache配置

Header always set X-Frame-Options "SAMEORIGIN"

如果完全不需要被嵌套,可以直接用CSP的 frame-ancestors 'none' 替代。

X-Content-Type-Options:防MIME嗅探

作用:告诉浏览器不要猜测资源的MIME类型,按服务器声明的类型处理。防止攻击者上传伪装文件绕过XSS过滤。

配置

X-Content-Type-Options: nosniff

Nginx配置

add_header X-Content-Type-Options "nosniff" always;

这个头部配置非常简单,但能避免很多MIME混淆攻击,强烈建议开启

Referrer-Policy:控制Referer

作用:控制HTTP Referer头部的发送规则,避免敏感信息(如URL中的token)泄露给第三方。

可选值

  • no-referrer:不发送Referer
  • same-origin:只对同源发送
  • strict-origin:只发送origin,跨域降级时不发送
  • strict-origin-when-cross-origin:同源发完整URL,跨域只发origin(推荐)
  • no-referrer-when-downgrade:HTTPS→HTTP不发送,其他都发(旧默认)

推荐配置

Referrer-Policy: strict-origin-when-cross-origin

Nginx配置

add_header Referrer-Policy "strict-origin-when-cross-origin" always;

Permissions-Policy:权限策略

作用:控制浏览器功能(摄像头、麦克风、地理位置等)的使用权限,替代旧的Feature-Policy。

配置示例

Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()

常见指令

  • camera=():禁止摄像头
  • microphone=():禁止麦克风
  • geolocation=():禁止地理位置
  • payment=():禁止支付API
  • usb=():禁止WebUSB

Nginx配置

add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()" always;

如果你的网站不需要这些功能,建议全部禁用,减少攻击面。

完整的安全头配置

Nginx完整配置

server {
    listen 443 ssl http2;
    server_name example.com;
    
    # SSL配置
    ssl_certificate /path/to/fullchain.crt;
    ssl_certificate_key /path/to/private.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    
    # 安全响应头
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self'; frame-ancestors 'none';" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()" always;
    
    # 其他配置...
}

Apache完整配置

<VirtualHost *:443>
    ServerName example.com
    
    SSLEngine on
    SSLCertificateFile /path/to/fullchain.crt
    SSLCertificateKeyFile /path/to/private.key
    
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
    Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; frame-ancestors 'none';"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-Content-Type-Options "nosniff"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()"
</VirtualHost>

宝塔面板配置安全头

宝塔用户不用改配置文件,直接在面板操作:

  1. 网站 → 设置 → 配置文件
  2. 找到server块,粘贴上面的add_header配置
  3. 保存 → 重载配置

或者用宝塔的”网站 → 设置 → 反向代理 → 自定义头”功能(部分版本支持)。

验证安全头是否生效

配置完成后,用以下方法验证:

方法1:浏览器开发者工具

F12 → Network → 点击主文档请求 → 看Response Headers

方法2:在线工具

SSL测试工具 检测,会报告所有安全头是否配置正确。

方法3:命令行

curl -I https://example.com

看返回的头部字段是否齐全。

安全头评分参考

Google的Lighthouse和Mozilla Observatory会根据安全头配置打分:

评分 等级 说明
90-100 A+ 安全配置优秀
80-89 A 配置良好
70-79 B 基本安全
60-69 C 需要改进
50-59 D 配置不足
<50 F 安全风险高

目标至少达到A级(80分以上)。

常见问题

Q:配置CSP后网站样式乱了怎么办?

A:CSP限制了CSS来源,把内联样式和外部CSS都加到style-src里。先用 Content-Security-Policy-Report-Only 测试。

Q:HSTS配置后无法访问怎么办?

A:说明SSL证书有问题。先修复证书,再用浏览器 chrome://net-internals/#hsts 删除HSTS记录。

Q:X-Frame-Options和CSP frame-ancestors都要配吗?

A:配置一个就行。CSP frame-ancestors是新标准,但老浏览器不支持X-Frame-Options,建议两个都配。

Q:安全头会影响网站性能吗?

A:不会。安全头只是响应头的几个字段,对性能没有影响,反而CSP能减少不必要的资源加载。

最后

HTTP安全响应头是网站安全的”第二道防线”(第一道是SSL证书),配置简单效果显著。HSTS、CSP、X-Content-Type-Options这三个是必配的,其他的根据需要添加。

整个配置过程不超过10分钟,但能挡住大部分XSS、点击劫持、MIME嗅探攻击。配上SSL证书一起用,网站安全性会上一个台阶。有问题欢迎留言交流。

本文到此结束