CSRF
简介
CSRF指服务器端请求伪造: 由攻击者伪造客户端的虚假访问,导致服务端做出反应,危害用户数据.
危害
在客户不知情的情况下数据被修改,且服务端数据有被篡改的风险
产生
产生的方式有多种,主要目的就是瞒过用户,伪造请求; 例如:误导用户点击,构造虚假链接
举例:
1.伪造get请求
简单的CSRF攻击:
用户登录访问某有csrf漏洞的银行网站http://www.xxbank.com。
用户被某些信息诱导访问危险网站B
危险网站B上有一个标签
<img src="http://www.xxbank.com/from=Alice&amount=100&to=Bob">
这个img标签的src不指向图片,而是一个http请求,这个请求让银行服务器从Alice转100到Bob账户上,由于Alice已经登录,浏览器发请求时候会带上cookie骗取服务器信任得到响应。
这样Alice的钱就被悄悄转走了。
涉及敏感操作的请求应改为POST请求。
2.伪造post请求
危险网站伪造一个隐藏的表单,在onload事件中,触发表单的提交事件。
为防止跳转,可以加一个隐藏的iframe,在iframe中处理提交的请求。
防御
- 校验referer
解释:例如是用户点击的话,请求应该来自于用户真实访问的网站,如:www.baidu.com下的访问的请求到百度服务器,referer就应该是baidu.com;如果攻击者要伪造点击信息,那么referer就是其伪造的网站地址. - 使用token令牌
就是在服务端生成一段token,前端每次提交请求到后端的时候,检验该token是否携带token且是否为自己生成,如果不是,则拦截掉该请求。 - 添加验证码(短信,图片,滑动图)
添加这样让攻击者不能模拟一次完整的请求
优点:简单粗暴,低成本,可靠。
缺点:用户不友好。每次都要填,验证码输入错误要重填。 - 自定义属性
在http请求头中增加自定义属性,其实这种方式和验证token比较类似,不过这里并不是把token作为请求参数,而是放在http请求头中。