一句话总结:
CSRF攻击就像骗子伪造你的签名去银行转账——利用你的登录状态偷偷干坏事!防御方法是给操作加暗号(Token)、检查来源(Referer)、设置快递拒收陌生包裹(SameSite Cookie)!
一、CSRF攻击原理(外卖骗局比喻)
场景:
- 你登录了外卖平台(已认证),还没退出。
- 骗子发你一个链接:“点这里领红包!”
- 你点击后,页面偷偷向外卖平台发请求:“把收货地址改成骗子家!”
- 外卖平台看到是你登录的,直接执行操作。
关键点:
- 利用信任:浏览器自动携带你的Cookie(登录凭证)。
- 无需窃密:攻击者不需要知道你的密码,只要诱骗你点击链接。
二、防御方法(三步护身术)
1. 加暗号:CSRF Token
-
原理:每个表单生成唯一Token(如一次性密码),提交时校验。
-
代码示例:
<!-- 表单中嵌入Token --> <form action="/change_address" method="POST"> <input type="hidden" name="csrf_token" value="随机字符串"> <input type="text" name="new_address"> <button>提交</button> </form> -
效果:攻击者无法伪造Token,请求被拒绝。
2. 查来源:验证Referer头
-
原理:检查请求是否来自合法页面(如只允许本站来源)。
-
代码示例(伪代码):
if request.referer not in allowed_domains: return error("非法请求来源!") -
缺点:Referer可能被篡改或隐私模式下缺失。
3. 快递拒收:SameSite Cookie
-
原理:设置Cookie的SameSite属性,限制跨站请求携带Cookie。
- Strict:完全禁止跨站携带(如银行转账)。
- Lax:允许部分安全请求(如导航跳转)。
- None:允许携带,但必须配合Secure(HTTPS)。
-
代码示例:
Set-Cookie: session_id=abc123; SameSite=Lax; Secure
三、进阶防御(组合拳)
-
敏感操作二次验证:
- 修改密码、转账前需输入短信验证码或当前密码。
-
自定义请求头:
- AJAX请求添加自定义头(如
X-Requested-With: XMLHttpRequest),后端校验。
- AJAX请求添加自定义头(如
-
定期更换Token:
- Token绑定用户会话,会话过期则Token失效。
四、常见框架的CSRF防护
| 框架 | 防护方式 | 启用方法 |
|---|---|---|
| Django | 自动生成和校验CSRF Token | 表单中加{% csrf_token %} |
| Spring Security | 默认启用CSRF防护 | 需配合Thymeleaf使用<input type="hidden" name="_csrf"> |
| Express | 使用中间件(如csurf) | app.use(csurf()) |
五、总结口诀
“CSRF攻击悄无声,利用登录乱折腾。
防御三招要牢记:Token、来源、Cookie禁。
框架自带防护盾,敏感操作加验证。
安全策略组合用,网站牢固如长城!”