题目
什么是CSRF攻击?列举两种常见的防御方法
信息
- 类型:问答
- 难度:⭐
考点
CSRF概念,攻击原理,防御措施
快速回答
CSRF(跨站请求伪造)是一种恶意攻击,攻击者诱导用户在已登录的Web应用中执行非预期的操作。
主要防御方法:
- 同步令牌(CSRF Token):服务器生成随机Token嵌入表单或请求头,验证请求合法性
- SameSite Cookie属性:设置Cookie的SameSite属性为Strict或Lax,限制跨域发送Cookie
一、原理说明
CSRF攻击利用浏览器自动携带Cookie的特性:
- 用户登录可信网站A,服务器返回包含身份验证的Cookie
- 用户未登出时访问恶意网站B
- 网站B的页面包含向网站A发请求的代码(如隐藏表单)
- 浏览器自动携带网站A的Cookie发送请求,导致在用户不知情时执行操作(如转账)

二、代码示例
攻击示例(恶意表单):
<!-- 恶意网站上的隐藏表单 -->
<form action="https://bank.com/transfer" method="POST">
<input type="hidden" name="amount" value="1000">
<input type="hidden" name="to" value="attacker_account">
<input type="submit" value="点击领红包">
</form>
<script>document.forms[0].submit()</script> // 自动提交防御示例(同步令牌):
// 服务端生成Token(Node.js示例)
app.use((req, res, next) => {
res.locals.csrfToken = crypto.randomBytes(16).toString('hex');
next();
});
// 前端嵌入Token
<form action="/transfer" method="POST">
<input type="hidden" name="_csrf" value="<%= csrfToken %>">
...
</form>
// 服务端验证
app.post('/transfer', (req, res) => {
if(req.body._csrf !== req.session.csrfToken) {
return res.status(403).send('CSRF验证失败');
}
// 处理正常请求
});三、最佳实践
- 同步令牌(推荐):
- 为每个用户会话生成唯一Token
- Token需足够随机(如使用密码学安全随机数)
- 将Token嵌入表单隐藏域或HTTP请求头(如X-CSRF-Token)
- SameSite Cookie:
- 设置Cookie:
Set-Cookie: sessionId=abc123; SameSite=Lax; HttpOnly - Strict:完全禁止跨站携带Cookie
- Lax(平衡选择):允许安全HTTP方法(GET)的跨站请求携带Cookie
- 设置Cookie:
- 关键操作二次验证:敏感操作(如支付)要求重新输入密码
四、常见错误
- 仅依赖Referer验证:Referer可能被篡改或缺失(HTTP->HTTPS跳转)
- GET请求修改状态:GET请求不应执行写操作,避免被<img>标签触发
- Token存储不当:将Token存在Cookie而非Session中,可能被XSS窃取
- SameSite=None:错误配置为None且未加Secure属性,导致防御失效
五、扩展知识
- CSRF vs XSS:
- XSS:在目标网站注入恶意脚本,窃取数据
- CSRF:利用用户登录态,伪造请求执行操作
- 同源策略(SOP):浏览器安全基础,但允许跨域嵌入资源(如图片、表单),CSRF利用此特性
- 防御组合:实际项目中应同时使用CSRF Token + SameSite + 敏感操作验证