5月27日 21:45
什么是 HttpOnly Cookie?如何使用 HttpOnly Cookie 防止 XSS 攻击?
什么是 HttpOnly Cookie
HttpOnly 是 Cookie 的一个属性,设置后浏览器禁止 JavaScript 通过 document.cookie 读取该 Cookie,从而阻止 XSS 攻击窃取会话信息。
核心原理
浏览器在收到 Set-Cookie: sessionId=abc123; HttpOnly 响应头后,会将该 Cookie 标记为只读。此时 document.cookie 的返回值中不包含该条目,恶意脚本无法获取。
httpSet-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Strict
javascript// 未设 HttpOnly → 可窃取 document.cookie; // "sessionId=abc123; theme=dark" // 已设 HttpOnly → 不可见 document.cookie; // "theme=dark"
如何设置
Node.js Express:
javascriptres.cookie("sessionId", token, { httpOnly: true, secure: true, sameSite: "strict" });
PHP:
phpsetcookie("sessionId", $token, [ "httponly" => true, "secure" => true, "samesite" => "Strict" ]);
Nginx:
nginxproxy_cookie_flags ~ httponly secure samesite=strict;
局限性
HttpOnly 只能防止 Cookie 被读取,不能阻止 XSS 本身。攻击者仍可通过 XSS 执行以下操作:
- 利用
fetch("/api/transfer", {credentials:"include"})携带 Cookie 发起请求 - 修改页面 DOM 或重定向到钓鱼网站
- 窃取未设 HttpOnly 的其他 Cookie
因此 HttpOnly 必须与 CSP、SameSite、输入过滤等手段配合使用。
追问
HttpOnly 能防 CSRF 吗? 不能。CSRF 是浏览器自动携带 Cookie 发起的跨站请求,与 JavaScript 读取无关,需靠 SameSite 或 CSRF Token 防护。
哪些 Cookie 不应设 HttpOnly? 前端 JS 需要访问的功能性 Cookie,如主题偏好、语言设置等。会话和认证类 Cookie 必须设 HttpOnly。
设了 HttpOnly 为什么还会丢 Cookie? 中间人攻击可在未加密的 HTTP 上截获 Cookie,必须同时设置 Secure 属性强制 HTTPS 传输。