HttpOnly 能防 CSRF 吗?我是不是搞混了概念?

欧阳雨萱 阅读 37

最近在做登录功能,看到资料说要加 HttpOnly 防止 XSS 窃取 cookie,但我以为它也能防 CSRF,结果测试发现照样能被跨站请求伪造,是不是理解错了?

比如我后端设置了 Set-Cookie: sessionid=abc123; HttpOnly; Secure,前端用 fetch 发请求时浏览器还是会自动带上这个 cookie,那攻击者构造一个恶意页面发起请求,不就绕过了吗?

<!-- 恶意网站上的代码 -->
<form action="https://mybank.com/transfer" method="POST">
  <input type="hidden" name="to" value="hacker">
  <input type="hidden" name="amount" value="1000">
  <input type="submit" value="点我领红包!">
</form>

HttpOnly 到底和 CSRF 有啥关系?是不是还得额外加 CSRF token 才行?

我来解答 赞 4 收藏
二维码
手机扫码查看
2 条解答
a'ゞ宏骞
你这个问题是典型的把HttpOnly和CSRF搞混了。HttpOnly只能防XSS偷cookie,防不了CSRF。必须用CSRF token来防CSRF攻击,两码事。

最简单粗暴的方案就是在表单里加个token:
<form action="/transfer" method="POST">
<input type="hidden" name="_csrf" value="随机生成的token">
...
</form>


后端每次校验这个token,不匹配的直接拒绝。这才是防CSRF的正确姿势。
点赞
2026-03-07 23:05
文鑫(打工版)
你确实搞混了,HttpOnly 只是管 JavaScript 读不到 cookie,完全挡不住浏览器自动带 cookie 发请求,所以防不住 CSRF。最简单的办法是直接在 Set-Cookie 里加个 SameSite=Strict 或者 SameSite=Lax 属性,这样浏览器遇到跨站请求就不会带 cookie 了,比折腾 CSRF token 省事多了。

Set-Cookie: sessionid=abc123; HttpOnly; Secure; SameSite=Strict
点赞 3
2026-03-03 21:17