目录
什么是CSRF攻击
CSRF:Cross-site request forgery,“跨站请求伪造”,黑客引诱用户打开黑客的网站,在黑客的网站用,利用用户的登录状态发起的跨站请求。简单来讲,CSRF攻击就是黑客利用了用户的登录状态,并通过第三方的站点来做一些坏事
自动发起GET请求
<h1>
CSRF攻击
</h1>
<img src="https://tobao.com/sendMoney?user=unsafename&number=1000" />
利用这个隐藏的img标签,欺骗浏览器这是一张图片资源,当页面被加载的时候,浏览器会自动发起img的资源请求,如果服务器没有对请求做出判断的话,那么服务器就会认为该请求是一个转账请求,并做出金额的转让
自动发起POST请求
<form action="https://tobao.com/sendMonay" method=POST id="unsafeForm">
<input type="hidden" name="user" value="unsafename" />
<input type="hiden" name="number" value="1000" />
</form>
<script>
document.getElementById('unsafeForm').submit();
</script>
利用隐藏的表单,该表单的内容就是某个安全网站的转账接口,用户打开网站后,表单会被自动提交
引诱用户点击链接
除了自动发起GET和POST请求之外,还有一种方法就是引诱用户点击黑客站点上的链接
<a href="https://taobao.com/senMoney?user=unsafename&number=1000">点击下载美女照片</a>
如果用户点击了下载链接,那么就会发送相关请求
与XSS区别
CSRF攻击不需要将恶意代码注入用户的页面,仅仅是利用服务器的漏洞和用户的登录状态来实施攻击
防范CSRF攻击
Cookie的SameSite属性
因为黑客利用的是用户的登录状态来发起CSRF攻击,而Cookie正式浏览器和服务器维护状态的一个关键数据,因此要阻止CSRF攻击,主要考虑在Cookie上
SameSite的三个取值:
-
Strict:最为严格,浏览器完全禁止第三方Cookie
-
Lax:相对宽松,在第三方站点的链接打开和从第三方站点提交GET方式的表单会携带上Cookie。但如果第三方中使用POST方法或者通过img或者iframe等标签加载URL,是不会携带Cookie的
-
None:没有限制,任何情况下都会携带Cookie
验证请求的来源站点
由于CSRF攻击大多来自第三方站点,因此服务器可以禁止第三方站点的请求
HTTP请求头中的Refer和Origin属性可以记录
-
Refer:记录了HTTP请求的来源地址
-
Origin:一般跨站请求都会带上
CSRF Token
-
浏览器向服务器发起请求时,服务器生成一个CSRF Token。其实就是一个字符串,然后植入到页面中
<form action="https://taobao.com" method=POST> <input type="hidden" name="csrf-token" value="asdfgh...."> <input type="text" name="user"> <input type="text" name="number"> </form>
-
如果发起请求,则把CSRF Token带上,服务器验证该Token是否合法。如果第三方站点发出的请求,无法获取到CSRF Token的值,那么即时请求了,服务器也会因此拒绝服务