cookie安全

cookie的domian,path,expires,这些在cookie操作中都会经常用到

但是对于客户端浏览器来说这些都是可见的,通过document.cookie可以直接在脚本里输出,这里很容易被注入一些js脚本,获取到本地的cookie,发送到其他地方去,泄露个人隐私,也许大家会认为session安全,通常会听到某某某大侠说,session是保存在服务端的,比cookie安全,可是某某某大侠真的清楚http协议吗?http协议规范定义http是无状态协议, 那么为什么能在服务端保存状态, 建议大家看一下我写的session原理。

    相信用过tomcat的人都会知道有个jsessionid这个东东,这个便是服务端为了保持客户端的状态,通常在客户端cookie里写入的jsessionid这个参数, 这个cookie的有效期是进程, 也就是关闭浏览器,即失效, 如果在客户端不支持cookie的情况下, 服务端可以通过url rewrite技术重写客户端请求url, 也就是在客户端请求url的后便加入jsessionid=xxxxxxx这样的参数,但归根结底还是在客户端保存了jsessionid这样的信息,cookie与url的参数都可以被本地植入的脚本取到, 打开firefox的firebug,,在控制台输入document.cookie;看一下,所有的cookie信息全在里边了, 在IE中可以在地址栏里直接输入javascript:alert(document.cookie);.也可以看到cookie中的信息,所以这样保存的cookie一旦被黑客注入的脚本获得到,就可以发送jsessionid这样的东东到其他地方去。

    很多人使用session验证用户登录状态,包括spring security这样的安全框架,默认都是采用session来保存用户状态信息,那么一旦某个用户登录了,但是jsessionid通过黑客的脚本,就可以被发送到其他地方,黑客可以直接吧jsessionid参数贴在请求url之后,那么一切的验证就从容而破。
  
    针对这样的问题,可以采用http only的cookie, 使得本地脚本无法获得该cookie, 只有通过http协议的程序才能使用这个cookie,加上cookie限制domian,达到防止恶意脚本泄露cookie的目的,基于原理来看http only cookie 是很简单的:

Set-Cookie  ASP.NET_SessionId=h1tgc555io1lav2dfi1pqdiq; path=/; HttpOnly


比起一般的cookie,只是在后端加入了HttpOnly的字符串,这项规范早在Internet Explorer 6 SP1就引入了(这是我第一次对微软有好感^!^),在现在的主流浏览器中,firefox,chrome都有支持,如果是这样的cookie,则在本地使用document.cookie是得不到的,浏览器已经对dom隐藏该cookie, 但是现在sun的api还未对改属性做支持,如果要在java中用到,只能手动去设置相应的cookie头,加上HttpOnly, 希望sun, 不应该是oracle了, 杯具, 尽快支持吧。



你可能感兴趣的:(浏览器,脚本,chrome,asp.net,firefox)