题目
什么是CSRF攻击?如何防御?
信息
- 类型:问答
- 难度:⭐
考点
CSRF概念,攻击原理,防御措施
快速回答
CSRF(跨站请求伪造)是一种利用用户已登录状态发起的恶意请求攻击。核心防御方法:
- 使用CSRF Token验证请求来源
- 设置Cookie的SameSite属性为Strict或Lax
- 关键操作增加二次验证(如密码确认)
原理说明
CSRF攻击原理:当用户登录网站A后,恶意网站B诱导用户点击链接或加载资源,利用浏览器自动携带Cookie的特性,以用户身份在网站A执行非预期操作(如转账、改密码)。攻击流程:
- 用户登录信任网站A,获得身份Cookie
- 用户访问恶意网站B,B页面包含指向A的恶意请求
- 浏览器自动携带A的Cookie发送请求
- 网站A误认为是用户合法操作
代码示例
攻击示例(恶意表单):
<!-- 恶意网站B的页面 -->
<form action="https://bank.com/transfer" method="POST">
<input type="hidden" name="amount" value="1000">
<input type="hidden" name="to" value="hacker">
<input type="submit" value="点击抽奖">
</form>防御示例(添加CSRF Token):
<!-- 服务端生成Token存入session -->
<?php $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); ?>
<!-- 前端表单携带Token -->
<form action="/transfer" method="POST">
<input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">
<!-- 其他表单字段 -->
</form>
<!-- 服务端验证 -->
<?php
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die("CSRF token validation failed");
}
?>最佳实践
- CSRF Token:为每个用户会话生成唯一Token,包含在表单或AJAX请求头中
- SameSite Cookie:设置关键Cookie的SameSite属性(推荐Strict)
- 敏感操作防护:重要操作(如支付)要求二次验证
- 框架内置防护:使用现代框架(如Spring Security、Django CSRF中间件)
常见错误
- 仅依赖Referer检查(可能被篡改或缺失)
- Token未绑定用户会话或未及时过期
- GET请求执行写操作(应严格遵循REST规范)
- 在JSON API中忽略CSRF防护(需在请求头添加Token)
扩展知识
- SameSite级别:
- Strict:完全禁止第三方Cookie
- Lax:允许安全跨站链接(默认值)
- None:允许所有跨站Cookie(需配合Secure属性)
- 双重提交Cookie:将Token同时放在Cookie和请求参数中,验证一致性
- 同源策略:浏览器安全基础,但CSRF利用其Cookie规则漏洞