CSRF (跨站请求伪造)
1. 什么是CSRF
CSRF, 跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性, 两者区别于CSRF是跨站请求, XSS是跨站攻击。但事实上CSRF与XSS差别很大,XSS利用的是站点内的信任用户,而CSRF则是通过伪装来自受信任用户的请求来利用受信任的网站。
CSRF通过伪装来自受信任用户的请求来利用受信任的网站。通俗的说就是攻击者利用了你的身份,发送了恶意请求。就好比黑客盗用了你的qq然后假装是你,骗你朋友要钱。(也可以理解为钓鱼网站)
2. CSRF原理
如上图所示,用户先登录网站A,然后访问恶意站点B,用户在恶意站点B中点击了一个链接,这个链接跳转回A网站的同时发送了一个恶意get请求,类似 http://www.***.com/test.php?para=***(恶意请求)。除了get请求外,webB也可以伪造post请求。
当个比方:
1) 假设某人A用支付宝向B付款的数据包为:
http://www.alipay.com/pay.php?name=sh&account=123456@qq.com&money=100
2) 而A正在阅览hacker伪造的博客, 博客首页中有代码:
<script scr="http://www.alipay.com/pay.php?name=sh&account=123456@qq.com&money=100"></script>
3) 当A正在访问该伪造的博客, 且他的支付宝已处于登录状态, 会发生什么?
4) 结果是, A会给用户sh的账号123456@qq.com转账100元 (当然支付宝不可能会出现这种漏洞, 这里只是打个比方)
也就是说, 当管理员正在登录且操作后台的时候, 这时候访问了某个网站, 这个网站中带有一些后台操作的数据包, 那么这时候就会已管理员的权限去操作后台。
3. 防范
- 通过检验网页的来路:
即Referer, 当网站A检测到当前Referer不是A的时候, 拒绝请求。在php中, 通过 $_SERVER[''SERVER_REFERER"]检 测来源
- tolen校验:
比如用户在访问webA时,会生成一个随机的token(保存在 Session 中),以后每次访问网站A时都带上token,服务端校 验token是否合法。因为token具有随机性,所以网站B就不能用普适的方法来伪造A的请求。token有各种实现方式,可 以放在请求参数中也可以放在请求头中。
- 尽量使用post, 少用get:
GET接口太容易被拿来做CSRF攻击,看上面示例就知道,只要构造一个img标签,而img标签又是不能过滤的数据。 接口最好限制为POST使用,GET则无效,降低攻击风险。
当然POST并不是万无一失,攻击者只要构造一个form就可以,但需要在第三方页面做,这样就增加暴露的可能性。
- 设cookie为httpOnly:
CRSF攻击很大程度上是利用了浏览器的cookie,为了防止站内的XSS漏洞盗取cookie,需要在cookie中设 置“HttpOnly”属性,这样通过程序(如JavaScript脚本、Applet等)就无法读取到cookie信息,避免了攻击者伪造 cookie的情况出现。
比如, 在Java的Servlet的API中设置cookie为HttpOnly的代码如下:response.setHeader( "Set-Cookie", "cookiename=cookievalue;HttpOnly");
参考: