什么是 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 请求头的 Referer
和 Origin
属性
Referer
记录了该 HTTP 请求的来源地址,但是有一些场景不适合暴露请求的 url 给服务器,因此浏览器提供给开发者一个选项,具体参考 Referer Policy
但是在服务器端验证请求头中的 Referer
并不是太可靠,因此标准委员会又制定了 Origin
属性

(三)CSRF Token
CSRF 验证可以过滤掉 CSRF 攻击
大致流程
- 浏览器向服务器发送请求时,服务器生成一个 CSRF Token
-
这是一个服务器生成的字符串,然后将该字符串植入到返回的页面上
-
- 在浏览器发起转账的请求的时候,需要带上页面上的 CSRF Token
- 然后服务器会验证 Token 是否合法
- 如果请求是第三方网站发出的,那么将无法获取到 CSRF Token 的值
- 这样服务器会因为 CSRF Token 不正确而拒绝请求
网友评论