1、CSRF 是个啥?
CSRF 是跨站请求伪造(Cross Site Request Forgery),它和 XSS 的攻击性相当,危害性也是非常大的。
举个例子,小明今天打开电脑登录 qq,然后去别的小网站找苍老师的学习视频,正在津津有味的学习的过程中,这时候走入了 CSRF 的攻击流程!这个网站的内容是大黑客精心布局的,画面非常刺激。典型的 CSRF 攻击就是点击 B 网站,影响 A 网站。比如,点击小网站,qq 号被盗。
其原理通俗点讲就是:攻击者盗用了你的身份,并以你的名义发送恶意请求或消息,盗取你的账号。比如说用攻击者盗取了你 qq 邮箱的身份,那么它就可以以你的名义发送邮件,这样不仅你的隐私会泄露,你的邮件还可以散播病毒,危害极大。
2、CSRF 的防御手段
解决的办法一定是在服务器端做相应的处理:
(1)服务器端最好过滤掉 GET 请求,尽量使用 POST 请求
因为 GET 请求的参数会显示在 url 上,这样就及其容易被人利用。比如说黑客知道了转账的 url 及参数,那他就可以构建一个 <img> 标签,它的 src 就是你转账的 GET 请求的 url,当你点击黑客构造的页面后,img 标签就会自动发送转账请求,这样就会导致用户的金额被而已转账。
POST 可以很大程度上降低被攻击的风险,但也并不是万无一失的。比如黑客可以构建一个带有 form 表单的网页,通过 script 脚本来触发 submit,这样也能完成恶意转账。
(2)加入验证码
上面这种防御手段并不彻底,即使使用 POST 请求也会存在被攻击的风险,所以可以在前者的基础上加入验证码,这就是为什么大家在登录网站或手机银行转账的过程中需要添加验证码的原因了。
验证码的方式有很多,比如手机短信、图片滑动、点击图片中的字等,加入验证码之后就可以保证了当前的行为是用户发出的而不是黑客伪造的请求了。除非黑客可以破解这个验证码,但是现代化的这些验证码基本上没有办法破解。
(3)验证 Referer
Referer 是存在于 HTTP 报文头部的一个字段,它是由浏览器提供的,可以记录当前请求的来源地址。黑客在伪造请求时只能在自己的网站上构造请求,这样的话服务器验证 Referer 就可以知道这个请求并不是自己网站内部的请求,而是黑客伪造的,直接拒绝。
使用这种方式的好处是简单、方便,一般的开发人员就不用去操心 CSRF 的安全性漏洞了,只需要在转账的接口中加一个拦截器,去验证请求的 Referer 值就可以了。
这种验证 Referer 的方式固然简单高效,但是也并不是万无一失的,虽然说 Referer 的值是由浏览器提供的,但是在某些浏览器上黑客是可以在发送请求时去篡改 Referer 或其他 Header 的值的,这样的话就i相当于跳过了验证,从而又可以进行 CSRF 攻击了。
(4)Anti CSRF Token
之所以会出现 CSRF 的攻击,本质原因是黑客可以伪造用户的请求,用户的请求信息实际上是存在 cookie 中的,所以黑客可以在不知道上述那些验证信息直接跳过安全验证。所以防御 CSRF 的关键点在于当用户的请求在发出的时候,黑客不能去伪造这个信息,并且这个信息不能存在于 cookie 之中。
下面说一种专门预防 CSRF 攻击的方法:Anti CSRF Token。Token,就是令牌,最大的特点就是随机性,不可预测。
Anti CSRF Token 原理上是通过 session token 来实现的。当客户端请求页面时,服务器会生成一个随机数 Token,并且将 Token 放置到 session 当中,然后将 Token 发给客户端(一般通过构造 hidden 表单)。下次客户端提交请求时,Token 会随着表单一起提交到服务器端,服务器端会在收到请求后用拦截器去对 Token 的值进行验证,判断是否和 session 中的 Token 值相等,若相等,则可以证明请求有效,不是伪造的。