CSRF(跨站请求伪造)攻击原理与防御策略
请解释 CSRF 攻击的原理,以及 Token 验证/Samesite Cookie/Referer 检查等防御策略的实现方式。
回答
苦行僧
CSRF 攻击原理:
用户登录银行网站(已鉴权)
用户未登出时访问恶意网站
恶意网站自动向银行发起转账请求(携带 Cookie)
银行以为是合法请求 → 执行转账
- 关键:利用浏览器自动携带 Cookie 的机制
- 适用于 GET 和 POST 请求
防御策略:
1. CSRF Token(最常用):
<form>
<input type="hidden" name="_csrf" value="随机Token">
</form>
- 服务器生成随机 Token,嵌入表单/请求头
- 提交时验证 Token 是否合法
- 恶意网站无法获取 Token(同源策略阻止读取服务器响应)
- Express 可用
csurf中间件
2. SameSite Cookie:
Set-Cookie: sessionId=xxx; SameSite=Strict
- Strict:完全禁止跨站发送 Cookie
- Lax(默认 Chrome 80+):GET 请求(导航)可发送,POST 不发送
- None:允许跨站,必须配合 Secure(HTTPS)
3. Referer/Origin 检查:
- 验证
Referer或Origin头是否为合法域名 - 局限:部分隐私模式下不发送 Referer
4. 验证码:
- 关键操作(转账、删除账号)需要验证码
- 最有力但用户体验稍差
5. 双重提交 Cookie:
- 请求同时携带 Cookie 中的值和自定义 Header 中的相同值
- 服务器验证两者一致