美文网首页
CSRF 跨站请求伪造

CSRF 跨站请求伪造

作者: bestCindy | 来源:发表于2021-01-19 18:27 被阅读0次

什么是 CSRF

CSRF 英文全称是 Cross-site request forgery,又叫做 “跨站请求伪造”

黑客首先引诱用户打开黑客的网站,在黑客的网站中,利用用户的登录状态发起跨站请求

就是黑客利用了用户的登录状态,并通过第三方的站点来做一些事情

CSRF 可以做哪些事情

(一)自动发起 Get 请求

举个例子:

<body>
  <h1>黑客的站点</h1>
  <img src="https://xxxxxxxx">
</body>

在这段代码中,黑客可以将转账的请求接口隐藏在 img 标签内,当页面被加载时,浏览器会自动发起 img 的资源请求

如果服务器没有对请求进行判断的话,那么服务器就会认为这是一个转账的请求

(二)自动发起 POST 请求

就是当用户打开黑客的站点的时候自动提交 POST 请求

(三)引诱用户点击链接

比如页面上放了一张美女的图片,下面放了图片下载的地址,但是这个下载地址实际上是黑客用来转账的接口

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

明确产生 CSRF 攻击的三个必要条件

  • 目标站点要有 CSRF 漏洞
  • 用户要登录过目标站点,并且在浏览器上保持有该站点的登录状态
  • 需要用户打开一个第三方站点

如何防止 CSRF 攻击

Cookie 的 SameSite 属性

Cookie 是浏览器和服务器之间维护登录状态的一个关键数据

我们可以在设置 HTTP 响应头中通过 set-cookie 设置 Cookie 时,可以带上 SameSite 选项

这样我们在实现从第三方站点发送请求时禁止 Cookie 的发送

设置之后,浏览器通过不同来源发送 HTTP 请求时,有如下区别:

  • 如果是从第三方站点发起的请求,那么需要浏览器禁止发送某些关键 Cookie 数据到服务器
  • 如果是同一个站点发起的请求,那么需要保证 Cookie 数据的正常发送

(二)验证请求的来源站点

就是需要告诉服务器请求来源,然后在服务器端验证请求来源的站点

怎么验证呢?

需要用到 HTTP 请求头的 RefererOrigin 属性

Referer 记录了该 HTTP 请求的来源地址,但是有一些场景不适合暴露请求的 url 给服务器,因此浏览器提供给开发者一个选项,具体参考 Referer Policy

但是在服务器端验证请求头中的 Referer 并不是太可靠,因此标准委员会又制定了 Origin 属性

(三)CSRF Token

CSRF 验证可以过滤掉 CSRF 攻击

大致流程

  • 浏览器向服务器发送请求时,服务器生成一个 CSRF Token
    • 这是一个服务器生成的字符串,然后将该字符串植入到返回的页面上


  • 在浏览器发起转账的请求的时候,需要带上页面上的 CSRF Token
  • 然后服务器会验证 Token 是否合法
  • 如果请求是第三方网站发出的,那么将无法获取到 CSRF Token 的值
  • 这样服务器会因为 CSRF Token 不正确而拒绝请求

相关文章

网友评论

      本文标题:CSRF 跨站请求伪造

      本文链接:https://www.haomeiwen.com/subject/nvkczktx.html