CSRF

概念与原理

  • CSRF(Cross-site Request Forgery,跨站请求伪造)是一种网络安全漏洞,也被称为 one-click attack 或者 session riding。攻击者诱导已登录用户在不知情的情况下,向受信任网站发送非预期的恶意请求(如修改密码、转账),从而冒用用户身份执行操作。它利用了浏览器自动发送Cookie的特性,核心是“冒用身份”而非“窃取数据”。
  • 简单讲三者的区别就是:SSRF是伪造服务端的请求,那CSRF就是伪造客户端的请求,XSS 跨站脚本攻击
    XSS (跨站脚本攻击):攻击者在网站注入脚本,目的是窃取Cookie或劫持会话。
    CSRF (跨站请求伪造):攻击者伪造请求,利用用户现有的身份执行操作,不一定能读取到网站返回的内容。

CSRF 攻击原理与流程

简单说就是在A网站中执行了用户的登录,通过了身份的验证,浏览器会保存Session Cookie。之后访问恶意网站,攻击者向A发送请求的时候自动携带Cookie。利用的是用户网站的已登录状态。

这里的部分内容能够感觉到xss,在请求中加入可以利用的标签,这个标签的作用就是将需要用户去访问的恶意网站放进来。

  • GET请求

    存在部分标签可以自动触发GET请求

    • <img>

      <iframe>

      <script>

      <link>

    请求实际上就是自动触发的,且带有Cookie的

  • POST请求

    伪造一个form表单,自动提交请求

    1
    2
    3
    4
    5
    <form action="http://bank.example/withdraw" method=POST>
    <input type="hidden" name="account" value="xiaoming" />
    <input type="hidden" name="amount" value="10000" />
    <input type="hidden" name="for" value="hacker" />
    </form><script> document.forms[0].submit(); </script>

    action → 目标接口

    method → 请求方式

    input → 请求参数
    hidden 参数的攻击意义 用户不可见
    document.forms[0].submit(); 按这个 form 的定义,立刻发一个 HTTP 请求

  • 钓鱼链接

    这个不会自动提交请求,还需要用户进行点击触发

常见防御措施:

防御策略主要是两个方向:

一是把其他域名请求的外源给阻止,二是加入验证信息,证明你是本域的请求

同源策略是一个重要的安全策略,它用于限制一个源的文档或者它加载的脚本如何能与另一个源的资源进行交互。同源定义为三同:协议、域名、端口号均相同。不同源的资源无法直接互访、读写Cookie/LocalStorage或进行AJAX通信。

方向一:组织不明外域的访问

也就是相当于在已登录的状态下,检查自动携带Cookie的这个请求的来源

标记来源域名这一点上,请求中通常携带两个首部,包含Origin HeaderReferer Header,这两个请求头的作用就是判断是否是用户,但是由于隐私设置,用户请求中不一定会提供请求头,并且直接对无请求头的请求直接拦截是不可能的

所以在解决这个问题上,由请求头转换成另一种属性

谷歌提出了same-site cookies概念,same-site cookies 是基于 Chrome 和 Mozilla 开发者花了三年多时间制定的 IETF 标准。它是在原有的Cookie中,新添加了一个SameSite属性,它标识着在非同源的请求中,是否可以带上Cookie,它可以设置为3个值,分别为:Strict、Lax、None Strict是最严格的,它完全禁止在跨站情况下,发送Cookie。只有在自己的网站内部发送请求,才会带上Cookie。不过这个规则过于严格,会影响用户的体验。比如在一个网站中有一个链接,这个链接连接到了GitHub上,由于SameSite设置为Strict,跳转到GitHub后,GitHub总是未登录状态。 Lax的规则稍稍放宽了些,大部分跨站的请求也不会带上Cookie,但是一些导航的Get请求会带上Cookie,如下:

None就是关闭SameSite属性,所有的情况下都发送Cookie。不过SameSite设置None,还要同时设置Cookie的Secure属性,否则是不生效的。

方向二:提交时要求附加本域才能获取的信息

也就是在请求限制中加上一些不能通过crsf获取的附加信息

  • CSRF Token (最常用):服务器在表单或Header中生成随机的、不可预测的Token,用户提交时验证该Token。如果请求中没有合法的Token,服务器则拒绝服务。

  • SameSite Cookie属性:设置 Cookie 的 SameSite=StrictLax,限制第三方网站发送的请求携带Cookie,可有效防御大多数场景。

  • 验证码/二次确认:在执行关键操作时要求用户进行验证码或密码确认。

  • 双重Cookie采用以下流程:

    在用户访问网站页面时,向请求域名注入一个Cookie,内容为随机字符串(例如csrfcookie=v8g9e4ksfhw)。

    在前端向后端发起请求时,取出Cookie,并添加到URL的参数中(接上例POST https://www.a.com/comment?csrfcookie=v8g9e4ksfhw)。

    后端接口验证Cookie中的字段与URL参数中的字段是否一致,不一致则拒绝。

    请求中要带着cookie里的参数,因为CSRF无法获取Cookie,所以变相的防御了CSRF

任何跨域都会导致前端无法获取Cookie中的字段(包括子域名之间)

Icon
致谢名单
本作品由 LwhalE 于 2026-02-10 15:19:12 发布
作品地址:CSRF
除特别声明外,本站作品均采用 CC BY-NC-SA 4.0 许可协议,转载请注明来自 LwhalE's blog
Logo