5月27日 21:45

什么是 HttpOnly Cookie?如何使用 HttpOnly Cookie 防止 XSS 攻击?

HttpOnly 是 Cookie 的一个属性,设置后浏览器禁止 JavaScript 通过 document.cookie 读取该 Cookie,从而阻止 XSS 攻击窃取会话信息。

核心原理

浏览器在收到 Set-Cookie: sessionId=abc123; HttpOnly 响应头后,会将该 Cookie 标记为只读。此时 document.cookie 的返回值中不包含该条目,恶意脚本无法获取。

http
Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Strict
javascript
// 未设 HttpOnly → 可窃取 document.cookie; // "sessionId=abc123; theme=dark" // 已设 HttpOnly → 不可见 document.cookie; // "theme=dark"

如何设置

Node.js Express:

javascript
res.cookie("sessionId", token, { httpOnly: true, secure: true, sameSite: "strict" });

PHP:

php
setcookie("sessionId", $token, [ "httponly" => true, "secure" => true, "samesite" => "Strict" ]);

Nginx:

nginx
proxy_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 传输。

标签:XSS