CSRF--跨站请求伪造

发布于:2024-11-28 ⋅ 阅读:(10) ⋅ 点赞:(0)
什么是CSRF?

CSRF是一种通过伪造用户身份来完成未授权操作的攻击方式。攻击者利用受害者已登录状态下的身份凭证(如Cookie),在受害者不知情的情况下发送恶意请求,从而让目标系统执行攻击者意图的操作。


CSRF的攻击原理
  1. 用户登录到受信任的网站A,并生成了有效的会话凭证(如Cookie)。
  2. 用户未注销网站A,保持登录状态。
  3. 用户访问了攻击者控制的恶意网站B。
  4. 恶意网站B向网站A发送请求(可能是表单提交、图片加载、JavaScript等)。
  5. 网站A根据请求中的Cookie认为请求是合法的,并执行操作。

CSRF的典型攻击场景
  1. 恶意资金转账
    • 攻击者诱导用户点击恶意链接,触发对银行系统的资金转账请求。
  2. 账户信息更改
    • 攻击者伪造请求更改受害者的个人信息、密码或邮箱。
  3. 发送恶意请求
    • 利用受害者身份在论坛、社交平台等发布垃圾信息。

CSRF的危害
  • 身份盗用: 攻击者冒充受害者执行敏感操作。
  • 数据泄露: 可能修改或窃取用户数据。
  • 系统破坏: 利用管理员权限删除资源或更改系统设置。

CSRF的防御措施
1. 使用CSRF Token
  • 在表单或请求中附加一个随机生成的唯一Token。
  • 服务器验证Token是否匹配,避免伪造请求。
  • 示例:

    <input type="hidden" name="csrf_token" value="random_token_value">

  • 服务端校验:

    if request.form['csrf_token'] != session['csrf_token']: return "Invalid CSRF Token"

2. 验证Referer或Origin
  • 检查请求头的Referer或Origin字段,确认请求来源是否是合法域名。
  • 缺点:可能被中间代理或浏览器禁用。
3. 使用SameSite Cookie
  • 设置Cookie的 SameSite 属性,限制跨站请求时携带Cookie。

    Set-Cookie: sessionid=abc123; SameSite=Strict

  • 值说明:
    • Strict:禁止所有跨站点请求携带Cookie。
    • Lax:允许部分安全的跨站请求(如GET表单提交)。
4. 要求用户验证
  • 在执行敏感操作前,要求用户输入密码或进行二次验证。
5. 避免GET请求执行敏感操作
  • 使用POST方法处理修改或删除类的操作,避免通过GET暴露。
6. 限制跨域请求
  • 使用CORS(跨域资源共享)策略,限制跨站请求访问。
7. 设置验证码
  • 重要操作前通过验证码确认用户身份,防止自动化攻击。

CSRF与XSS的区别
特性 CSRF XSS
攻击对象 服务器 客户端浏览器
利用方式 借助用户已登录状态伪造请求 注入恶意脚本并在用户浏览器中执行
攻击目的 伪造用户请求执行未授权操作 窃取用户数据、会话或诱导执行恶意操作
主要防御手段 CSRF Token、SameSite Cookie、Referer验证 输入验证、输出转义、内容安全策略(CSP)

总结

CSRF通过利用用户身份欺骗服务器,可能导致严重的业务风险。为了有效防御CSRF攻击,应综合使用CSRF Token、Referer验证、SameSite Cookie等技术手段,结合合理的请求设计和用户身份验证机制,从根本上消除隐患。