介绍
csrf(cross site request forgery)跨站请求伪造,也被称为 one-click attack 或者 session riding。它和xss一样,都是一种网络攻击方式。从它的名字我们可以看出,这是一种以受害人的名义发送请求的一种攻击。
原理
攻击者究竟是如何利用csrf发动攻击让用户中招于无形的呢。大致过程是这样的:
- 用户登陆受信任网站A
- 在没有退出的情况下又去浏览其他网站
- 不幸的是该网站恰好带有攻击性代码,它要求去访问网站A
这样在用户不知情的情况下一个请求就发出去了。
csrf.jpg
(这是之前看资料的时候看到的一张图片,觉得挺形象的,就保留下来了,具体哪个网站忘记了。。。)
csrf攻击分为get型和post型,下面我们来一一说下
get型攻击
就是通过get请求发起的攻击。示例如下:
当我们点击垃圾箱的时候,实际上是发起了一个get请求(
http://wp-admin/content.php?action=trash&wpnonce=48a05ef771
)把当前这一条数据给删除掉。当我们正在浏览这个网站的时候,有人给发过来了一条短信,里面包含一条链接,出于好奇点了进去,里面包含一条超链接(
<a href="http://wp-admin/content.php?action=trash&wpnonce=48a05ef771">海量好物任你选,快来看看吧~~</a>
), 购物欲驱使我们点了进去,于是刚才网站上的那个条目就被删除了。。。。
post型攻击
就是通过post请求发起的攻击,我们如何构造一个post请求呢,比如说还是刚才那个网站,我要新增一个条目:
<!DOCTYPE html>
<html>
<body>
<form action="http://wp-admin/content.php" id="form" method="POST"> // action就是受攻击网站要提交的接口地址
<input type="text" name="name" value="aaaaa"> // name就是传的参数
</form>
<script type="text/javascript">
document.getElementById('form').submit();
</script>
</body>
</html>
这样执行这个页面之后,就会在网页新增一个条目
csrf的攻击对象
csrf攻击能让受害人产生实质性损害的,就是那些要直接改变数据的请求,比如银行转账操作啦,购物网站购买东西啦等等之类的操作,像是获取信息的请求比如查看账户有多少钱是不会产生啥影响的(当然,查看完账户余额起了别的心思就不好说了,哈哈哈)。所以主要要对这些改变数据的请求做验证。
csrf的防御
目前防御csrf攻击的策略主要有三种:验证 HTTP Referer 字段;添加校验token;在http头中自定义属性并验证
1. 验证http referer字段
http请求头中,有一个referer字段,纪录了该请求的来源地址。比如打开百度的首页,随便点开一个请求
referer.png
所以正常的话用户发送的请求referer应该是受信任网站的地址,hacker发动csrf攻击只能是在他自己的网站构造请求,如果用户通过hacker的网站发送了请求,referer值应该是hacker的网站地址,所以后台只要检查referer的值就可以,如果不合法的话就拒绝该请求。但是用户可以设置浏览器在发送请求的时候不携带referer字段,万一用户设置了,校验的时候没有referer字段请求通不过就有问题了
2. 添加校验token
csrf之所以可以成功,是因为请求完全可以伪造,用户的验证信息存储于cookie中,所以hacker只要能拿到请求地址跟请求参数就可以了。现在,我们在请求参数中加入一个token字段,token的值是服务端随机生成的,每次请求都去校验token的值,只要token值不正确或者没有token参数,就认为是不安全的请求。因为token的值是服务端随机生成的,每次都不一样,所以就安全了许多。但是每个请求都要加上这个参数,也是很繁琐的。
3. 在http头中自定义属性并验证
这种跟上一种方法差不多,就是不是在参数里面加了,而是加在http请求头上,只需要设置一次,比上一种方法便捷许多。
网友评论