为什么不要点击小广告——CSRF攻防

一、什么是CSRF

全称Cross-site request forgery,译作跨站请求伪造。简单来说,就是利用技术手段欺骗用户通过浏览器去访问自己曾经认证过的网站。

二、攻击场景

Eric通过向银行网站 https://bank.com?count=eric&fro=sam&money=100 发起请求,给Sam转账100块。银行网站通常会验证这是否来自于一个合法的session,同时该session的帐号是否已登录。

Luck虽然可以构造请求 https://bank.com?count=eric&for=luck&money=100 向银行网站发送,但是由于验证不通过,所以不能够获得Eric的转账。

此时Luck开始利用CSRF攻击,做一个网站,在网站中放入代码 src=”https://bank.com//count=eric&for=luck&money=100″,然后通过广告等手段诱使Eric触发代码生效。

于是从Eric的浏览器想银行网站发出了 https://bank.com?count=eric&for=luck&money=100 的请求,若此时Eric刚访问银行网站不久,其session尚未过期。那么此次请求将通过验证,Eric的100块就到Luck账户下了。

三、如何防范

1.验证referer

即检查当前请求的来源,例如上面攻击场景的例子。Eric登录银行网站 https://bank.com 后,referer中会携带 bank.com的信息,如果发现请求中referer不是来自 bank.com,则一律拒绝。

优点:简单便捷。

缺点:某些浏览器允许用户修改referer;部分用户为了保护自己的隐私,决绝浏览器提供referer;另外就是在代码中构造referer也可以进行伪造。

2.请求中添加token验证

用户登录后生成一个token放进session,每次请求时将token一起传递,服务端从session中取token与请求参数中的token校验。

优点:相较于验证referer,安全性高一点。

缺点:如何让请求中都带上token参数很麻烦,有的实现是在页面加载时用JS遍历DOM树,添加token参数;token本身有安全性问题,论坛网站中黑客通过发指向自己网站链接的帖子,进而可以获取token。

3.在HTTP头中自定义属性并验证

使用XMLHttpRequest类进行请求,所有该类发起的请求都带上token参数。由于XMLHttpRequest类的请求不会被浏览器记录,所以不用担心token泄露,也不用考虑如何添加token参数。

优点:不用考虑添加麻烦的token参数,同时不会被浏览器记录。

缺点:XMLHttpRequest类通常用于Ajax异步刷新请求,并非所有类都适用于这个请求;由于不会被浏览器所记录,所以无法做前进、后退、收藏、刷新等操作,给用户带来不便。

四、参考资料

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

© 2018-2019 惜春令 京ICP备18010644号 网站地图