浅谈CSRF攻击
2018-04-02 本文已影响0人
湾里晴空
CSRF攻击概念
- CSRF跨站点请求伪造,是一种对网站的恶意利用,其通过伪装来自受信任用户的请求来利用受信任的网站。
- 可以这样来理解:攻击者盗用了你的身份,以你的名义发送恶意请求,对服务求来说请求是完全合法的,但是却完成了攻击者期望的一个操作,比如以你的名义发送邮件,转账,发消息等
CSRF攻击原理过程如下
- 用户C打开浏览器,访问受信任的网站A,输入用户名和密码请求登录网站A;
- 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功请求到网站A
- 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问B;
- 网站B接受到用户的请求后,返回攻击代码,并发出一个请求要求访问第三方站点A;
- 浏览器在接受到攻击性代码后,根据网站B的要求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是B发起的,所以会根据用户C的cookie信息以C的权限处理该请求,导致恶意代码被执行。
防范CSRF攻击的方法
- 验证 HTTP Referer 字段。 根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。因此,要防御 CSRF 攻击,服务端网站只需要对于每一个请求验证其 Referer 值
然而,这种方法并非万无一失。Referer 的值是由浏览器提供的,虽然 HTTP 协议上有明确的要求,但是每个浏览器对于 Referer 的具体实现可能有差别,并不能保证浏览器自身没有安全漏洞。使用验证 Referer 值的方法,就是把安全性都依赖于第三方(即浏览器)来保障,从理论上来讲,这样并不安全。 - 在请求地址中添加 token 并验证。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。对于 GET 请求,token 将附在请求地址之后,这样 URL 就变成 http://url?csrftoken=tokenvalue。 而对于 POST 请求来说,要在 form 的最后加上 <input type=”hidden” name=”csrftoken” value=”tokenvalue”/>,这样就把 token 以参数的形式加入请求了
-在 HTTP 头中自定义属性并验证。 这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。