0%

CSRF攻击与防御

CSRF 攻击与防御详解

CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种利用用户身份进行未授权操作的网络攻击。攻击者通过诱导用户在已登录的情况下访问恶意链接,以用户的名义向目标网站发送伪造请求,从而执行转账、修改密码等敏感操作。以下从攻击原理、危害及防御措施展开说明。

CSRF 攻击的核心原理

CSRF 攻击的本质是利用浏览器的身份认证机制(如 Cookie)和网站对用户身份的信任,具体流程如下:

  1. 用户登录目标网站:用户在 A 网站(如银行网站)登录后,服务器生成 Cookie 并存储在用户浏览器中,用于后续身份验证。
  2. 攻击者诱导用户访问恶意网站:用户在未退出 A 网站的情况下,点击攻击者构造的恶意链接(如 B 网站的图片、链接)。
  3. 恶意请求发送到目标网站:恶意链接会自动向 A 网站发送请求(如转账请求),浏览器会自动携带 A 网站的 Cookie。
  4. 目标网站验证通过:A 网站收到请求后,通过 Cookie 识别用户身份,误认为是用户主动操作,执行恶意请求(如转账给攻击者)。

关键条件

  • 用户已登录目标网站(浏览器保存了有效的身份凭证,如 Cookie)。
  • 攻击者能构造与目标网站一致的请求格式(如 URL、参数、请求方法)。

CSRF 攻击的常见场景与危害

典型场景

  • 转账 / 支付:攻击者构造转账请求,以用户名义向指定账户转账。
  • 修改个人信息:如修改用户邮箱、密码,窃取账号控制权。
  • 发布内容:以用户名义在论坛发布垃圾信息或恶意言论。

危害

  • 盗用用户身份执行敏感操作,造成财产损失或隐私泄露。
  • 损害网站信誉(如用户误以为网站存在安全漏洞)。

CSRF 攻击的防御措施

防御 CSRF 的核心是让网站能够识别请求是否为用户主动发起,而非攻击者伪造。主要措施如下:

1. 增加 Token 验证(最有效手段)

原理

在请求中加入一个随机生成的 Token(如 CSRF Token),服务器仅处理包含有效 Token 的请求。由于攻击者无法获取该 Token(不存储在 Cookie 中),无法构造合法请求。

实现步骤
  1. 生成 Token:用户登录时,服务器生成随机 Token(如 UUID),存储在 Session 或数据库中,并将 Token 返回给前端(如嵌入表单的隐藏字段)。

    1
    2
    3
    4
    5
    6
    <form action="/transfer" method="post">
    <input type="hidden" name="csrf_token" value="随机生成的Token">
    <input type="text" name="amount" value="1000">
    <input type="text" name="toAccount" value="攻击者账户">
    <button type="submit">转账</button>
    </form>
  2. 验证 Token:用户提交请求时,前端将 Token 随参数一起发送,服务器校验 Token 是否与 Session 中存储的一致。若不一致,拒绝请求。

  3. Token 失效机制:Token 可设置过期时间,或在使用一次后失效,降低泄露风险。

原理

通过设置 Cookie 的SameSite属性,限制 Cookie 仅在同站点请求中发送,阻止跨站请求携带 Cookie。

配置方式

在服务器设置 Cookie 时添加SameSite属性:

  • SameSite=Strict:仅允许同站点请求携带 Cookie(完全禁止跨站请求)。
  • SameSite=Lax:允许部分跨站请求(如 GET 请求)携带 Cookie,限制 POST 等修改数据的请求。

示例(HTTP 响应头):

1
Set-Cookie: sessionId=xxx; SameSite=Strict; HttpOnly
优势

无需前端修改,直接通过服务器配置生效,兼容性良好(现代浏览器均支持)。

3. 验证 Referer/Origin 请求头

原理

HTTP 协议的Referer头记录了请求的来源地址,Origin头记录了请求的源站点(不含路径)。服务器可通过校验这两个字段,判断请求是否来自可信域名。

实现
  • 若请求来自本网站(如Refererhttps://www.xxx.com开头),则允许请求;
  • 若来自其他域名(如恶意网站),则拒绝请求。
局限性
  • Referer可被浏览器或插件篡改、省略(如 HTTPS→HTTP 的请求可能不发送Referer),存在误判风险。
  • 仅作为辅助防御手段,不建议单独使用。

4. 其他辅助措施

  • 使用 POST 请求:GET 请求的参数暴露在 URL 中,易被攻击者构造;POST 请求相对隐蔽,但仍需配合 Token 验证。
  • 短会话有效期:减少用户登录状态的持续时间,降低攻击窗口。
  • 二次验证:对敏感操作(如转账、改密)增加验证码、短信验证等额外验证步骤。

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10