关于CSRF攻击的原理和防范
CSRF攻击的概念
CSRF:跨站点请求伪造(cross-site request forgery)。简单来说就是,攻击者借用受害者的身份,向有CSRF漏洞的网站发送恶意请求。
举个例子:
攻击者盗用了受害者的身份,然后借用这个身份发送请求,如转账、购买商品等等。
CSRF原理
先在这个情节中设定三个对象:
- 有CSRF漏洞的网站:WebA
- 攻击者:WebB
- 受害者:User
其中WebB是攻击者自己做的一个网站,是一个危险网站。
流程如下:
- 首先,User是网站WebA的用户,User访问并登录该网站;
- 登录验证后,网站WebA自然要给客户端User返回Cookie信息,并保存在浏览器或本地;
- User在没有退出WebA的情况下,又去访问了危险网站WebB;
- WebB接收到了User的请求,返回一些恶意代码。该恶意代码发出了要访问WebA的请求request;
- 因为WebB发出要访问WebA的请求,则带着还保存在浏览器/本地的Cookie,直接去访问WebA;
- 由于访问请求一定会带上Cookie给服务器端即WebA,且Cookie实际上已经被攻击者WebB盗用了,所以WebA却无法判断该请求是User还是攻击者WebB发出的。故WebB成功地盗用User的身份,拥有了User访问WebA的权限,以User的身份去访问WebA,以达到攻击的目的。
通过这个例子,我们可以发现,实际上Cookie是不那么安全的。
因为我们无法保证,自己在访问WebA的时候,不会去打开别的网站;也不能保证我们的Cookie信息会过期而不被攻击者盗用。
所以有下面三个方法去防范CSRF攻击
- 验证HTTP Refer字段
- 请求地址中添加token并验证
- 使用验证码
方法一、验证HTTP Refer字段
HTTP协议中有一个Refer字段,该字段是用来记录HTTP请求的来源地址。
攻击者实施CSRF攻击时,从自己做的恶意网站,返回恶意代码,从而发送请求给漏洞网站。所以说,实际上这次恶意请求的来源地址是攻击者的恶意网站。
那么网站通过验证HTTP Refer字段,以确定请求是来自自己的网站,而不是来自第三方网站,就可以了。
如果验证后,发现Refer字段指向的是其它网站,那么就有可能是攻击者通过恶意网站发送的恶意请求。加以拒绝。
方法二、请求地址中添加token并验证
CSRF攻击成功的关键是在于:攻击者能够仅凭借Cookie信息,就伪装成受害者的身份,并没有其它验证身份的信息。
可以在请求中添加攻击者无法伪造的信息,并且这些信息不存在于Cookie中,而是保存在session中(session在服务器端,更加安全)。
原理:
在发起的HTTP请求中,以参数的形式即加入一个token,并且在服务器端拦截这个token加以验证。如果没有token或者token验证不通过,则有理由认为是CSRF攻击而拒绝该HTTP请求。
则token在用户登录后,产生并存放在session中。在每次请求时拿出来,与请求中的token做对比。