CSRF全程 Cross Site Request Forgery, 跨站域请求伪造.这种攻击方式相对于XSS,SQL注入等攻击方式比较晚被发现,今天就来说解下这种攻击方式以及避免方式.php
假设abc用户登陆银行的网站进行操做, 同时也访问了攻击者预先设置好的网站.html
abc点击了攻击者网站的某一个连接,这个连接是http://www.bank.com/xxxx
指向银行,银行服务器会根据这个连接携带的参数会进行转帐操做.git
银行服务器在执行转帐操做以前会进行SESSION验证是否登陆, 可是因为abc已经登陆了银行网站,攻击者的连接也是www.bank.com
.因此攻击的连接就会携带session id到银行服务器.github
因为session id是正确的,因此银行会判断操做是由本人发起的,执行转帐操做.数据库
根据上面的说明,咱们来模拟一下攻击的过程.浏览器
有www.bank.com
跟www.hacker.com
.用户abc登陆www.bank.com
网站以后点击了www.hacker.com
的点击抽大奖的诱骗连接安全
此连接会向www.bank.com
发起一个post请求.因为请求域名为www.bank.com
,因此请求会携带www.bank.com
的session id.服务器
www.hacker.com的代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form method="post" action="http://www.bank.com/transfer.php"> <input type="hidden" name="from" value="abc"> <input type="hidden" name="money" value="10000"> <input type="hidden" name="to" value="hacker"> <input type="button" onclick="submit()" value="点击抽大奖"> </form> </body>
能够发现,www.hacker.com
的网页中包含了一个向www.bank.com
发起的post请求.而且表单都没隐藏了,只有一个诱骗用户点击的按钮.cookie
完整的实例代码能够在github上找到.传送门.session
从上面的例子 能够看到csrf攻击.黑客不能拿到cookie,也没办法对服务器返回的内容进行解析.惟一能作的就是给服务器发送请求.经过发送请求改变服务器中的数据.上面的例子中攻击者诱导用户点击连接进行转帐操做,使得银行数据库中受害者的金额发生了改变.
了解了csrf攻击的原理和目标,提出了两种防护手段
根据HTTP协议,在http请求头中包含一个referer的字段,这个字段记录了该http请求的原地址.一般状况下,执行转帐操做的post请求www.bank.com/transfer.php
应该是点击www.bank.com
网页的按钮来触发的操做,这个时候转帐请求的referer应该是www.bank.com
.而若是黑客要进行csrf攻击,只能在本身的网站www.hacker.com
上伪造请求.伪造请求的referer是www.hacker.com
.因此咱们经过对比post请求的referer是否是www.bank.com
就能够判断请求是否合法.
这种方式验证比较简单,网站开发者只要在post请求以前检查referer就能够,可是因为referer是由浏览器提供的.虽然http协议有要求不能篡改referer的值.可是一个网站的安全性绝对不能交由其余人员来保证.
从上面的样式能够发现,攻击者伪造了转帐的表单,那么网站能够在表单中加入了一个随机的token来验证.token随着其余请求数据一块儿被提交到服务器.服务器经过验证token的值来判断post请求是否合法.因为攻击者没有办法获取到页面信息,因此它没有办法知道token的值.那么伪造的表单中就没有该token值.服务器就能够判断出这个请求是伪造的.