CSRF攻击:陌生链接不要随便点

什么是CSRF攻击?

CSRF 英文全称是 Cross-site request forgery,所以又称为“跨站请求伪造”,是指黑客引诱用户打开黑客的网站,在黑客的网站中,利用用户的登录状态发起的跨站请求。简单来讲,CSRF 攻击就是黑客利用了用户的登录状态,并通过第三方的站点来做一些坏事。
通常黑客会通过三种方式去实施CSRF攻击:

  1. 自动发起GET请求。
    接口隐藏在img标签内,欺骗浏览器这是一张图片资源。
  2. 自动发起POST请求。
    伪造POST请求,构建一个隐藏的表单,该表单的内容就是请求接口。
  3. 引诱用户点击链接。
    第三方链接

和 XSS 不同的是,CSRF 攻击不需要将恶意代码注入用户的⻚面,仅仅是利用服务器的漏洞和用户的登录状态来实施攻击。

如何防止 CSRF 攻击

发起 CSRF 攻击的三个必要条件:
第一个,目标站点一定要有 CSRF 漏洞;
第二个,用户要登录过目标站点,并且在浏览器上保持有该站点的登录状态;
第三个,需要用户打开一个第三方站点,可以是黑客的站点,也可以是一些论坛。

  1. 充分利用好 Cookie 的 SameSite 属性
    SameSite 选项通常有 Strict、Lax 和 None 三个值。
    Strict 最为严格。如果 SameSite 的值是 Strict,那么浏览器会完全禁止第三方Cookie。
    Lax 相对宽松一点。在跨站点的情况下,从第三方站点的链接打开和从第三方站点提交Get 方式的表单这两种方式都会携带 Cookie。禁止POST方法,或是Img, Iframe等标签加载的URL。
    而如果使用 None 的话,在任何情况下都会发送 Cookie 数据。
  2. 验证请求的来源站点
    Referer 是 HTTP 请求头中的一个字段,记录了该 HTTP 请求的来源地址。


    从上图可以看出,Origin 属性只包含了域名信息,并没有包含具体的 URL 路径,这是Origin 和 Referer 的一个主要区别。在这里需要补充一点,Origin 的值之所以不包含详细路径信息,是有些站点因为安全考虑,不想把源站点的详细路径暴露给服务器。
    因此,服务器的策略是优先判断 Origin,如果请求头中没有包含 Origin 属性,再根据实际
    情况判断是否使用 Referer 值。

  3. CSRF Token
    流程大致分为两步:
    第一步,在浏览器向服务器发起请求时,服务器生成一个 CSRF Token。CSRF Token 其实就是服务器生成的字符串,然后将该字符串植入到返回的⻚面中。你可以参考下面示例代码:

    <!DOCTYPE html>
    <html>
    <body>
    <form action="https://time.geekbang.org/sendcoin" method="POST">
    <input type="hidden" name="csrf-token" value="nc98P987bcpncYhoadjoiydc9aj
    <input type="text" name="user">
    <input type="text" name="number">
    <input type="submit">
    </form>
    </body>
    </html>

    第二步,在浏览器端如果要发起转账的请求,那么需要带上⻚面中的 CSRF Token,然后
    服务器会验证该 Token 是否合法。如果是从第三方站点发出的请求,那么将无法获取到
    CSRF Token 的值,所以即使发出了请求,服务器也会因为 CSRF Token 不正确而拒绝请
    求。

此文章为4月Day30学习笔记,内容来源于极客时间《浏览器原理》,学习使我快乐,每天进步一点点💪💪

豪猪
4 声望4 粉丝

undefined