题目
解释CSRF攻击原理及基础防御方法
信息
- 类型:问答
- 难度:⭐
考点
CSRF攻击原理,防御措施,安全机制理解
快速回答
CSRF(跨站请求伪造)是一种恶意利用用户已登录状态发起非预期请求的攻击方式。核心防御方法:
- 使用CSRF Token验证请求来源
- 关键操作检查Referer/Origin头
- 敏感操作要求二次验证(如密码确认)
一、攻击原理
CSRF(Cross-Site Request Forgery)攻击流程:
- 用户登录信任网站A,获得有效会话Cookie
- 用户访问恶意网站B,该网站包含伪造请求代码
- 浏览器自动携带网站A的Cookie向网站A发起请求
- 网站A误认为是用户合法操作执行请求(如转账)
示例攻击代码(恶意网站B):
<!-- 隐藏表单自动提交 -->
<form action="https://bank.com/transfer" method="POST">
<input type="hidden" name="amount" value="10000">
<input type="hidden" name="to" value="hacker">
</form>
<script>document.forms[0].submit()</script>二、防御措施
1. CSRF Token(最有效)
服务端生成随机Token绑定用户会话:
// 服务端生成Token(示例伪代码)
const csrfToken = generateRandomToken();
storeInSession(userSession, csrfToken);
// 在表单中嵌入Token
<form action="/transfer" method="POST">
<input type="hidden" name="csrf_token" value="${csrfToken}">
...
</form>
// 验证请求(服务端)
function handleRequest(req, res) {
if(req.body.csrf_token !== getFromSession(req.session)) {
return res.status(403).send("Invalid CSRF Token");
}
// 处理合法请求
}2. 检查HTTP头
- Referer/Origin验证:检查请求来源域名是否在白名单内
- SameSite Cookie属性:设置Cookie为
SameSite=Lax/Strict
3. 关键操作二次验证
敏感操作(如支付)要求:
- 重新输入密码
- 短信/邮箱验证码
三、最佳实践
- 对所有状态修改请求(POST/PUT/DELETE)使用CSRF Token
- Token需满足:
- 随机不可预测(至少128位)
- 绑定用户会话
- 单次有效(或短时效)
- 组合使用
SameSite=Lax+Token提供纵深防御
四、常见错误
- 仅对GET请求做防护(CSRF可触发POST请求)
- Token存储在Cookie而非Session中
- Token未绑定具体用户(如全局统一Token)
- 依赖Referer头但未处理空Referer情况
五、扩展知识
- 双重提交Cookie:前端从Cookie读取Token并放入请求头
- 框架内置方案:Django的
{% csrf_token %}、Spring Security的CsrfFilter - 与XSS区别:XSS利用站点漏洞注入脚本,CSRF利用用户登录状态