最近需要给自己的应用添加CSRF防御代码,顺便了解一下CSRF攻击。以下是对wiki的摘抄。
然而,Maria发现这个网银可以通过get请求发送相同的请求。
Maria希望利用这个漏洞,从Alice账户中搞点钱。
连接写好了,Maria希望通过邮件发给Alice,并且让Alice无意间触发这个请求。
如果Alice点击这个连接,那边钱就转到Maria手中了,但是一旦点击,页面就会跳转,那边Alice也就发现自己被攻击了。说以要使用0字节图片来隐藏请求。
CSRF(Cross-Site Request Forgery)从字面理解就是跨站伪造请求。CSRF攻击会让用户在不知道的情况下在信任站点下执行未知操作。这些未知操作可以是邮件中的一个连接或者其他网站上的一个图片。这种攻击可以盗取用户的信息,如果目标用户是管理员,那么骇客就会进入应用。
有很多方法可以让目标用户向一个网站提交或者下载一些数据。为了让攻击成功,我们必须要知道怎样产生一个让目标用户区执行的连接。让我们考虑下面的例子Alice要通过网银向Bob转100块钱,Alice提交的post请求如下:
POST http://bank.com/transfer.do HTTP/1.1
然而,Maria发现这个网银可以通过get请求发送相同的请求。
GET http://bank.com/transfer.do?acct=BOB&amount=100 HTTP/1.1
Maria希望利用这个漏洞,从Alice账户中搞点钱。
http://bank.com/transfer.do?acct=MARIA&amount=100000
连接写好了,Maria希望通过邮件发给Alice,并且让Alice无意间触发这个请求。
<a href="http://bank.com/transfer.do?acct=MARIA&amount=100000">View my Pictures!</a>
如果Alice点击这个连接,那边钱就转到Maria手中了,但是一旦点击,页面就会跳转,那边Alice也就发现自己被攻击了。说以要使用0字节图片来隐藏请求。
<img src="http://bank.com/transfer.do?acct=MARIA&amount=100000" width="1" height="1" border="0">
用户打开这个页面,浏览器就会把这个执行这个图片请求连接。被攻击的用户只能发现这个图片没加载出来。不会发现自己被攻击。