HTTP安全响应头配置详解:HSTS、CSP、X-Frame-Options
最近后台有用户问:我的网站装了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>
宝塔面板配置安全头
宝塔用户不用改配置文件,直接在面板操作:
- 网站 → 设置 → 配置文件
- 找到server块,粘贴上面的add_header配置
- 保存 → 重载配置
或者用宝塔的”网站 → 设置 → 反向代理 → 自定义头”功能(部分版本支持)。
验证安全头是否生效
配置完成后,用以下方法验证:
方法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证书一起用,网站安全性会上一个台阶。有问题欢迎留言交流。