跨站请求伪造(Cross Site Request Forgery), CSRF是一种网络攻击,欺骗受害者在登录状态下访问一个恶意网址,自动发送一个伪装成受害者请求来欺骗执行非法操作,从而实现攻击目的。
这个过程是怎么发生的呢?
(1)先要发现漏洞,比如某银行的网址是 http://bank.com,在登录后转账时的请求是: https://bank.com/transfer?account=pianzi&amount=1000
它表示要给 账号=pianzi的人转账1000元。知道了这个,下一步就是诱骗用户不知不觉中发起这个网络请求。
(2)这时骗子做了个娱乐网站,这个网站一打开就自动发起上面那个转账请求。
(3)受害者可能被诱骗进入了网站。或者被聊天工具发来了一个图片或者链接,一点击,就不知情的触发了请求,钱就跑到pianzi的账号里 去了。
这个过程有什么特点?
(1) 攻击一般发生在第三方网站,而不是有漏洞的那个网站;
(2) 攻击利用用户在被攻击网站的登陆凭证(cookie),冒充受害者提交操作,而不是直接窃取数据;
(3) 整个过程,攻击者并不能获取到登录凭证,而是冒用;
(4) 跨站请求可以用各种方式:img图片的src、a标签、form表单提交等等;
怎么防止发生?
对于个人来说,就是别乱点莫名的链接。
对于开发者来说。
- 实施同源策略: 在Web应用程序中,只允许同源的页面才能访问应用程序的资源。后端服务不要允许跨域请求设置(比如 Access-Control-Allow-Origin 标头设置为*)
- 使用CSRF令牌:在网站展示表单页面(比如转账页面),添加一个随机数令牌,页面中的form里生产一个名字叫做csrf_token的随机数,触发提交时携带这个csrf_token,因为这个csrf_token 是你发给浏览器的,你可以做校验是否合法。而骗子网站得不到这个在页面中的csrf_token。
- 增加操作确认:在涉及到重要操作的时候,比如删除账户或转账操作,要求用户进行额外的确认,比如输入密码、短信验证等。
- 使用HTTP-only Cookie,它可以防止从第三方网站发起的伪造请求里不携带真实的token。
- 减少使用 GET 请求:GET 请求容易被攻击者伪造,因为请求参数可以直接在URL中暴露