CSRF攻击
什么是CSRF攻击
CSRF 英文全称是 Cross-site request forgery,所以又称为“跨站请求伪造”,是指黑客引诱用户打开黑客的网站,在黑客的网站中,利用用户的登录状态发起的跨站请求。简单来讲,CSRF 攻击就是黑客利用了用户的登录状态,并通过第三方的站点来做一些坏事。
攻击方式
1、自动发起 Get 请求
<!DOCTYPE html>
<html>
<body>
<h1>黑客的站点:CSRF攻击演示</h1>
<img src="https://xxx.com?user=hacker&number=100">
</body>
</html>
比如你点了陌生的链接,被隐藏在img标签 ,你以为是张图片,结果它向xxx.com发送了一个get请求,并且携带了参数,它可能利用了你在xxx.com登陆过,发送请求的时候携带了xxx.com的cookie,它可能就是一个什么转账汇款啥的恶意操作
2、自动发起 POST 请求
<!DOCTYPE html>
<html>
<body>
<h1>黑客的站点:CSRF攻击演示</h1>
<form id='hacker-form' action="https://xxx.com/转账" method=POST>
<input type="hidden" name="user" value="hacker" />
<input type="hidden" name="number" value="100" />
</form>
<script> document.getElementById('hacker-form').submit(); </script>
</body>
</html>
这里写上中文转账就是想大致表达意思,可能隐藏了表单,同样也会携带相应的用户 cookie 信息发送了POST请求,进行恶意的操作
3. 引诱用户点击链接发送GET请求
<div>
<img width=150 src=http://images.xuejuzi.cn/1612/1_161230185104_1.jpg> </img> </div> <div>
<a href="https://xxx.com/转账啥的?user=hacker&number=100" taget="_blank">
点击下载美女照片
</a>
</div>
这段黑客站点代码,页面上放了一张美女图片,下面放了图片下载地址,而这个下载地址实际上是黑客用来转账的接口,一旦用户点击了这个链接,就发送了请求。
和XSS的区别
和 XSS 不同的是,CSRF 攻击不需要将恶意代码注入用户的页面,仅仅是利用服务器的漏洞和用户的登录状态来实施攻击。
攻击发生的条件
发生的必要条件:
- 第一个,目标站点一定要有 CSRF 漏洞;
- 第二个,用户要登录过目标站点,并且在浏览器上保持有该站点的登录状态;
- 第三个,需要用户打开一个第三方站点,可以是黑客的站点,也可以是一些论坛。
如何防止CSRF攻击
1.充分利用好 Cookie 的 SameSite 属性
CSRF攻击重点是携带用户登陆网站的cookie,利用cookie模拟用户向服务器发送请求
所以我们用cookie中一个重要字段:SameSite
在HTTP响应头的set-cookie中加上
比如
set-cookie: c=abcd;SameSite=none
看看SameSite的三个取值:
- Strict
如果 SameSite 的值是 Strict,那么浏览器会完全禁止第三方 Cookie。
比如你从A页面中访问 B 的资源,而 B 的某些 Cookie 设置了 SameSite = Strict 的话,那么这些 Cookie 是不会被发送到 B 的服务器上的。只有你从 B 的站点去请求 B 的资源时,才会带上这些 Cookie。
- Lax
相对宽松,在第三方站点只有 **get 方法提交表单 ** 和 a 标签发送 get 请求 两种会带上cookie,在第三方站点中使用 Post 方法,或者通过 img、iframe 等标签加载的 URL,这些场景都不会携带 Cookie
- None
默认模式,请求会自动携带上 Cookie。
2.验证请求的来源站点
服务器来验证请求来源
服务器的策略是优先判断 Origin,如果请求头中没有包含 Origin 属性,再根据实际情况判断是否使用 Referer 值
Origin 属性只包含了域名信息,并没有包含具体的 URL 路径,这是 Origin 和 Referer 的一个主要区别。在这里需要补充一点,Origin 的值之所以不包含详细路径信息,是有些站点因为安全考虑,不想把源站点的详细路径暴露给服务器
但是这两个请求头信息都可以伪造
3.CSRF Token
第一步,在浏览器向服务器发起请求时,服务器生成一个 CSRF Token。CSRF Token 其实就是服务器生成的字符串,然后我们前端保存在前端中。
第二步,在一些重要的请求 服务器要验证CSRF Token
总结
CSRF 英文全称是 Cross-site request forgery,所以又称为“跨站请求伪造”,是指黑客引诱用户打开黑客的网站,在黑客的网站中,利用用户的登录状态发起的跨站请求
攻击:
- 自动 GET 请求
- 自动 POST 请求
- 诱导点击发送 GET 请求
防范:
- cookie的 SameSite 属性
- 服务器验证请求头的Origin和Referer
- CSRF Token