修复方案:为 Cookie 设置 HttpOnly
标志(防止 XSS 窃取)
问题:如果 Cookie 未设置 HttpOnly
标志,攻击者可能通过 XSS(跨站脚本攻击) 窃取 Cookie,导致会话劫持。
解决方案:为所有会话 Cookie 和敏感 Cookie 启用 HttpOnly
,阻止 JavaScript 访问。
1. 什么是 HttpOnly
标志?
- 作用:
- 阻止 JavaScript(如
document.cookie
)访问 Cookie,仅允许 HTTP 请求携带。 - 有效缓解 XSS 攻击窃取 Cookie 的风险。
- 阻止 JavaScript(如
- 适用场景:
- 所有会话 Cookie(如
sessionid
、JSESSIONID
)。 - 任何不需要前端 JavaScript 访问的 Cookie。
- 所有会话 Cookie(如
2. 如何配置 HttpOnly
标志?
(1)Web 服务器层配置
Nginx(反向代理)
location / {
proxy_cookie_flags ~ httponly; # 强制所有 Cookie 启用 HttpOnly
proxy_pass http://backend;
}
生效:
nginx -t && systemctl restart nginx
Apache(mod_headers
)
Header always edit Set-Cookie "(.*)" "$1; HttpOnly"
生效:
systemctl restart apache2
(2)编程语言/框架层配置
Node.js(Express)
res.cookie('sessionID', '12345', {
httpOnly: true, // 启用 HttpOnly
secure: true, // 建议同时启用 Secure(HTTPS)
sameSite: 'Lax'
});
PHP
setcookie('sessionID', '12345', [
'httponly' => true, // 启用 HttpOnly
'secure' => true,
'samesite' => 'Lax'
]);
Java(Spring Boot)
# application.yml
server:
servlet:
session:
cookie:
http-only: true # 启用 HttpOnly
Python(Django)
# settings.py
SESSION_COOKIE_HTTPONLY = True # 会话 Cookie 启用 HttpOnly
CSRF_COOKIE_HTTPONLY = True # CSRF Cookie 启用 HttpOnly(如无需前端访问)
Ruby on Rails
# config/application.rb
config.session_store :cookie_store, httponly: true
(3)CDN/云服务配置(如 Cloudflare)
- 确保后端返回的
Set-Cookie
包含HttpOnly
。 - 如果使用 Cloudflare,可通过 Transform Rules 修改响应头:
{ "Set-Cookie": "*; HttpOnly" }
3. 验证 HttpOnly
标志是否生效
方法 1:浏览器开发者工具
- 访问网站,按 F12 → Application → Cookies。
- 检查目标 Cookie 是否标记为 HttpOnly。
方法 2:curl
命令行测试
curl -I https://example.com --cookie-jar /tmp/cookies.txt
cat /tmp/cookies.txt
预期输出:
#HttpOnly_example.com TRUE / TRUE 123456789 sessionID=12345; Secure; HttpOnly
方法 3:尝试通过 JavaScript 访问
在浏览器控制台输入:
console.log(document.cookie);
预期结果:
- 如果
HttpOnly
生效,敏感 Cookie 不会显示。
4. 注意事项
⚠️ 例外情况:
- 如果前端 JavaScript 必须访问某些 Cookie(如 CSRF Token),则不能对其启用
HttpOnly
。- 替代方案:将 CSRF Token 放在
<meta>
标签 或 响应头 中,而非 Cookie。
- 替代方案:将 CSRF Token 放在
✅ 最佳实践:
- 同时启用
Secure
(仅 HTTPS)和SameSite=Lax
(防 CSRF)。 - 定期审计 Cookie 使用情况,避免不必要的权限开放。
📌 总结
- 配置
HttpOnly
:在服务器、代码或 CDN 中强制启用。 - 验证:通过浏览器/命令行检查。
- 例外处理:对必须前端访问的 Cookie 单独处理。
修复后,即使网站存在 XSS 漏洞,攻击者也无法窃取关键 Cookie! 🔒