CSRF攻击防范小知识

一、背景

CSRF是一种常见的跨站伪造请求攻击,它通过伪造真实用户的请求,来欺骗服务器以实现非法操作的目的。相比于xss攻击,它无法读取到用户的cookie等隐私信息,但可以在规则之内做一些用户未感知的危险操作。

 

二、原理

它利用浏览器无法区分请求是否是用户真实操作的特点,来自动向被攻击服务发送请求。

举个例子:

1、假设用户登录了qq邮箱- qq.email, 这时候浏览器保存了用户的登录cookie等信息

2、这时候用户收到了一封钓鱼邮件,并且打开了邮件中的链接。

3、浏览器新开的页面实际是hacker的攻击页面,它里面包含以下内容:

<img src="qq.email?delete=1234" size=1/>

那么在用户打开这个页面时候,便会想qq邮箱发送一个请求,删除某些邮件,或者是其他非法操作。

这个时候,由于浏览器还保存了邮箱的cookie,在发送请求的时候,会自动带上用户的身份信息,因此,服务端会认为这是一个正常的用户请求,也就如实执行了删除等操作。

当然,对于post类型的接口,hacker在页面中可以加入如下代码:

<form method="POST" action="https://qq.email.com/mail/h/ewt1jmuj4ddv/?v=prf" enctype="multipart/form-data"> 
    <input type="hidden" name="cf2_emc" value="true"/> 
    <input type="hidden" name="cf2_email" value="hacker@hakermail.com"/> 
    .....
    <input type="hidden" name="irf" value="on"/> 
    <input type="hidden" name="nvp_bu_cftb" value="Create Filter"/> 
</form> 
<script> 
    document.forms[0].submit();
</script>

同样也是可以向post接口伪造请求的。

 

三、防范

CSRF的特点

  • 攻击一般发起在第三方网站,而不是被攻击的网站。被攻击的网站无法防止攻击发生。
  • 攻击利用受害者在被攻击网站的登录凭证,冒充受害者提交操作;而不是直接窃取数据。
  • 整个过程攻击者并不能获取到受害者的登录凭证,仅仅是“冒用”。
  • 跨站请求可以用各种方式:图片URL、超链接、CORS、Form提交等等。部分请求方式可以直接嵌入在第三方论坛、文章中,难以进行追踪。

CSRF通常是跨域的,因为外域通常更容易被攻击者掌控。但是如果本域下有容易被利用的功能,比如可以发图和链接的论坛和评论区,攻击可以直接在本域下进行,而且这种攻击更加危险。

 

防范的本质是区分哪些是用户真实的请求,并忽略那些伪造的请求。

1、增加token验证机制

在用户每次访问服务时,服务端根据一定的规则,比如时间+用户特则等进行编码,生成一个随机的token给到前端,同时,服务端自己也将在session中存储这个token信息。

前端将这个token保存在自己的上下文中,在下次发送请求的时候,便将这个token作为参数的一部分发送到服务端,然后服务端根据规则验证这个token是否有效,并对有效的请求进行处理。

 

2、双cookie验证机制

在用户访问网站页面时,向请求域名注入一个Cookie,内容为随机字符串(例如csrfcookie=v8g9e4ksfhw)。
在前端向后端发起请求时,取出Cookie,并添加到URL的参数中(接上例POST https://www.a.com/comment?csrfcookie=v8g9e4ksfhw)。
后端接口验证Cookie中的字段与URL参数中的字段是否一致,不一致则拒绝。

 

3、通过同源检测

通常,跨域的请求头中,可以通过以下两个属性值判断是否是同源请求。

origin: 通常只在post请求中,表示请求源是从哪里来的。通常它包含在跨域请求CORS中。但是对于ie11和302重定向,这个属性不会存在。

referer:表示请求来源,对于Ajax请求,图片和script等资源请求,Referer为发起请求的页面地址。对于页面跳转,Referer为打开页面历史记录的前一个页面地址。如果要防止图片被盗链使用,那么我们可以通过判断请求的此header属性,从而决定是否返回图片。而防止csrf攻击也是同样的道理。不过攻击者可以隐藏自己的referer.

posted @ 2020-07-26 12:51  sliec  阅读(222)  评论(0编辑  收藏  举报