
什么是 CSRF?
CSRF(Cross-Site Request Forgery,跨站请求伪造) 是一种常见的 Web 安全攻击,攻击者诱导已登录用户的浏览器,在用户毫不知情的情况下,对信任的网站执行非本意的操作。由于浏览器会自动携带用户的身份凭证(如 Cookie),攻击可以在受害者不知情的情况下冒充其身份完成敏感操作。
攻击原理
- 受害者已登录某个网站,如银行、邮箱、论坛等,浏览器已存有该网站的 Cookie。
- 攻击者诱导受害者访问一个恶意网页或点击钓鱼链接。
- 该网页会向受害者已登录的网站发起一个接口请求(如转账、修改邮箱等)。由于浏览器会自动带上 Cookie,目标网站会以为这是用户的正常请求。
- 攻击成功,受害者的敏感信息被篡改或资金被窃取。
简单的 CSRF 攻击示例
假设一个银行网站的转账接口如下:
<form action="https://bank.com/transfer" method="POST">
<input type="hidden" name="to" value="attacker_account">
<input type="hidden" name="amount" value="10000">
</form>
<script>
document.forms[0].submit();
</script>
如果受害者在登录状态下访问了此页面,就会自动向银行发起转账请求。
典型危害
- 伪造用户身份,进行未授权操作,如转账、修改邮箱、发帖
- 针对企业后台的批量恶意操作
- 结合社交网络进行大规模传播
CSRF 与 XSS 的区别
- CSRF:利用用户登录状态,诱导用户浏览器发起伪造请求,攻击代码通常不驻留在受害站点。
- XSS:注入脚本到目标站点,让其他用户执行恶意脚本。
防御措施
- CSRF Token
在每个敏感操作表单/请求中随机生成一个唯一的 csrf_token,服务端验证 token,攻击者无法预测。
- SameSite Cookie 属性
设置 Cookie 的
SameSite=Strict 或 Lax,限制第三方请求携带 Cookie。
- Referer/Origin 校验
后端检查请求头中的
Referer 或 Origin 来源是否合法。
- 用户交互验证
如二次确认弹窗、图形验证码等。
- 限制 Content-Type
仅允许特定 Content-Type 的请求通过,如
application/json,防止伪造表单请求。
实际开发建议
- 所有金融、设置等敏感操作都应加 CSRF 防护。
- 框架如 Django/Flask/Spring 等均内置 CSRF 防护机制,应正确配置和启用。
- 勿在用户数据或业务接口中仅依赖 Cookie 认证,结合 token、多因素认证提升安全性。
总结
CSRF 攻击隐蔽且危害极大,开发者在设计 Web 应用时必须对敏感操作提供充分且多层次的防护,以保障用户账号和数据安全。