如何从代码角度分析及防护CSRF

发布时间:2021-12-27 17:36:49 作者:柒染
来源:亿速云 阅读:152
# 如何从代码角度分析及防护CSRF

## 什么是CSRF攻击?

跨站请求伪造(Cross-Site Request Forgery, CSRF)是一种利用用户已登录的身份,在用户不知情的情况下执行非预期操作的攻击方式。攻击者诱导用户访问恶意页面,该页面自动向目标网站发起请求(如转账、修改密码等),由于浏览器会自动携带用户的Cookie,服务器会误认为是合法请求。

## 代码层面的CSRF攻击分析

### 典型攻击流程示例
```html
<!-- 恶意页面伪造请求 -->
<img src="https://bank.com/transfer?to=attacker&amount=10000" width="0" height="0">

当已登录银行网站的用户访问该页面时,浏览器会自动发起GET请求,携带用户的会话Cookie完成转账。

漏洞代码特征

  1. 未校验请求来源
# Flask漏洞示例
@app.route('/transfer', methods=['GET'])
def transfer():
    if 'user' in session:  # 仅检查登录状态
        execute_transfer(request.args.get('to'), request.args.get('amount'))
    return "Success"
  1. 敏感操作使用GET方法
// 不安全的API设计
app.get('/api/change-email', (req, res) => {
    updateEmail(req.query.newEmail);
});

代码级防护方案

1. 同步令牌模式(主流方案)

# Flask-WTF实现示例
from flask_wtf.csrf import CSRFProtect

app = Flask(__name__)
app.secret_key = 'secure_key'
CSRFProtect(app)

# 表单中自动生成令牌
<form action="/transfer" method="POST">
    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
    <!-- 其他表单字段 -->
</form>

2. 双重Cookie验证

// 前端设置自定义Header
fetch('/api/sensitive-action', {
    method: 'POST',
    headers: {
        'X-CSRF-TOKEN': getCookie('csrf_token')
    }
});

// 后端校验(Express示例)
app.post('/api/sensitive-action', (req, res) => {
    if (req.cookies.csrf_token !== req.headers['x-csrf-token']) {
        return res.status(403).send('Invalid CSRF token');
    }
    // 处理逻辑
});

3. SameSite Cookie属性

# Django配置示例
SESSION_COOKIE_SAMESITE = 'Strict'  # 或'Lax'
CSRF_COOKIE_SAMESITE = 'Strict'

进阶防护策略

关键操作二次验证

# 敏感操作要求重新认证
def change_password(request):
    if not request.user.check_password(request.POST.get('current_password')):
        return HttpResponse("密码验证失败", status=403)
    # 更新密码逻辑

请求频率限制

// Express限流中间件
const rateLimit = require('express-rate-limit');
const csrfLimiter = rateLimit({
    windowMs: 15 * 60 * 1000, // 15分钟
    max: 5 // 每个IP最多5次请求
});
app.use('/sensitive-action', csrfLimiter);

代码审计要点

  1. 检查所有状态变更请求(POST/PUT/DELETE)是否包含CSRF防护
  2. 验证令牌的生成和校验是否使用安全随机数
  3. 确认Cookie设置了HttpOnlySameSite属性
  4. 审计是否存在JSONP/CORS配置不当导致的安全隐患

总结

有效的CSRF防护需要:
✅ 敏感操作使用POST/PUT/DELETE方法
✅ 实现同步令牌或双重Cookie验证
✅ 合理设置Cookie安全属性
✅ 关键操作增加二次验证
✅ 配合日志监控和异常检测

通过代码层面的多重防护,可以显著降低CSRF攻击风险,建议结合OWASP CSRF防护指南进行定期安全审计。 “`

(注:实际字数为约720字,可根据需要扩展具体框架的实现细节或增加案例分析)

推荐阅读:
  1. 从Android源码的角度分析Binder机制
  2. django框架CSRF防护原理与用法分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

csrf

上一篇:怎么配置PicGo

下一篇:Manuka有什么用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》