COOKIE之安全设置漫谈
一、标题:COOKIE之安全设置漫谈
副标:httponly属性和secure属性解析
二、引言
经常有看到XSS跨站脚本攻击窃取cookie案例,修复方案是有httponly。今天写出来倒腾下...
2.1首先必须的预备cookie知识。假如你第一次认识cookie,请先阅读我的这篇文章:
<<COOKIE漫谈>>
三、Cookie属性
cookie内容,如图所示:

HTTP response header:
Set-Cookie: <name>=<value>[; <Max-Age>=<age>][; expires=<date>][; domain=<domain_name>]=[; path=<some_path>][; secure][; HttpOnly]
Cookie常用属性
一个Cookie包含以下信息:
1)Cookie名称,Cookie名称必须使用只能用在URL中的字符,一般用字母及数字,不能包含特殊字符,如有特殊字符想要转码。如js操作cookie的时候可以使用escape()对名称转码。
2)Cookie值,Cookie值同理Cookie的名称,可以进行转码和加密。
3)Expires,过期日期,一个GMT格式的时间,当过了这个日期之后,浏览器就会将这个Cookie删除掉,当不设置这个的时候,Cookie在浏览器关闭后消失。
4)Path,一个路径,在这个路径下面的页面才可以访问该Cookie,一般设为“/”,以表示同一个站点的所有页面都可以访问这个Cookie。
5)Domain,子域,指定在该子域下才可以访问Cookie,例如要让Cookie在a.test.com下可以访问,但在b.test.com下不能访问,则可将domain设置成a.test.com。
6)Secure,安全性,指定Cookie是否只能通过https协议访问,一般的Cookie使用HTTP协议既可访问,如果设置了Secure(没有值),则只有当使用https协议连接时cookie才可以被页面访问。
7)HttpOnly,如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息。

注意:上图为在w3shool上的setcookie语法,并没有显示7 httponly参数
四、认识httponly属性
4.1认识HTTPONLY
为了解决XSS(跨站脚本攻击)的问题,IE6开始支持cookie的HttpOnly属性,这个属性目前已被大多数浏览器(IE、FF、Chrome、Safari)所支持。当cookie中的HttpOnly属性被设置为true时(最后第7位),前端脚本就无法访问或操作cookie了(只能通过后台访问),这样XSS就失效了。 HttpOnly会话cookie支持的浏览器,将仅用于发送HTTP(或HTTPS)请求时,从而限制从其他非HTTP的API(如JavaScript)访问。减轻此限制,但会议通过跨站点脚本(XSS)的cookie盗窃的威胁并没有消除。此功能仅适用于会话管理的cookie,而不是其他的浏览器的cookies。-----------------这里还没理解过来的,没关系,继续往下看
4.2 httponly效果演示
先看例子演示:
1.php:
<?php setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE); ?> <script>alert(document.cookie);</script>

我们可以看到这个弹出来的这个框框是什么内容都没有的!
2.php:
<?php setcookie("abc", "test" ); ?> <script>alert(document.cookie);</script>

我们通过对比可以看出,有HTTPONLY的页面,JS是不能获取到COOKIES内容的,而没有HTTPONLY的页面,JS轻松获取COOKIES无压力!
简易理解:阻止客户端脚本访问Cookie
新浪微博XSS的时候,就遇到过HTTPONLY,即使你通过XSS获取到了用户的COOKIES,也无法通过这个COOKIES访问用户的页面,所以说,HTTPONLY的设置是每个网站必备的!
4.3.HttpOnly的设置样例(未测试可行性)
javaE
response.setHeader("Set-Cookie", "cookiename=value;
Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");
具体参数的含义再次不做阐述,设置完毕后通过js脚本是读不到该cookie的,但使用如下方式可以读取
Cookie cookies[]=request.getCookies();
C#
HttpCookie myCookie = new HttpCookie("myCookie");
myCookie.HttpOnly = true;
Response.AppendCookie(myCookie);
VB.NET
Dim myCookie As HttpCookie = new HttpCookie("myCookie")
myCookie.HttpOnly = True
Response.AppendCookie(myCookie)
但是在.NET 1.1 ,中您需要手动添加
Response.Cookies[cookie].Path += ";HTTPOnly";
Servlet3
只需要在web.xml中添加如下片段:
<session-config>
<cookie-config>
<http-only>true</http-only>
<secure>true</secure>
</cookie-config>
</session-config>
在PHP中,cookie的HttpOnly有两种设置方式
方法一:
header("Set-Cookie:tmp=100;HttpOnly");
方法二:
setcookie("tmp", 100, NULL, NULL, NULL, NULL, TRUE);
PHP4
header("Set-Cookie: hidden=value; httpOnly");
PHP5
setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE); //最后一个参数为HttpOnly属性
五、深挖
问:为什么设置了httponly-cookie盗窃的威胁并没有彻底消除?
答:因为httponly作用只是限制从其他非HTTP的API(如JavaScript)访问,cookie还是有可能传递的过程中被监听捕获后信息泄漏。
我查阅了msdn,它上面这么说的:

将 HttpOnly 属性设置为 true,并不能防止对网络频道具有访问权限的攻击者直接访问该 Cookie。针对这种情况,应考虑使用安全套接字层 (SSL) 来提供帮助。工作站的安全也很重要,原因是恶意用户可能使用打开的浏览器窗口或包含持久性 Cookie 的计算机,以合法用户的标识获取对网站的访问。
setcookie("tmp", 100, NULL, NULL, NULL, TRUE, TRUE);【https】
总结:
增多 cookie 安全性添加HttpOnly和secure属性
(1)HttpOnly属性
如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。
(2)secure属性
当设置为true时,表示创建的 Cookie 会被以安全的形式向服务器传输,也就是只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证,如果是 HTTP 连接则不会传递该信息,所以不会被盗取到Cookie 的具体内容。
对于以上两个属性,
secure属性是防止信息在传递的过程中被监听捕获后信息泄漏。 6号位true
HttpOnly属性的目的是防止程序获取cookie后进行攻击。7号位true
注意,为了降低XSS跨站点脚本攻击带来的损害,通常需要将HTTP-only Cookie和其他技术组合使用。如果单独使用的话,它无法全面抵御跨站点脚本攻击。可以使用专门的工具(fiddler2,burp)对安全性进行测试。XSS_cookie跨站点脚本攻击示例请参阅下列文章。
扩展:
1、AVA年份安全 第四周 SESSION COOKIE HTTPONLY 标识
2、http://msdn.microsoft.com/zh-cn/library/system.web.httpcookie.httponly.aspx
3、https://www.owasp.org/index.php/HTTPOnly
4、http://www.w3school.com.cn/php/func_http_setcookie.asp
5、Cookie使用安全、HttpOnly引见以及防止XSS攻击时的作用
6、http://www.myexception.cn/mobile/824869.html
COOKIE之安全设置漫谈的更多相关文章
- 通过HostOnly Cookie为Cookie正确的设置一级域名
前言 用户行为分析,最重要的一点就是通过埋点准确的获取用户的Cookie,那么这个Cookie到底怎么设置呢?那么如果面对的是站群,用户Cookie又该怎么设置,才能让访客量和新访客量准确无误呢? 接 ...
- 2.在程序中如何实现Cookie信息的设置,读取和删除
设置:你可以在IE的“工具/Internet选项”的“常规”选项卡中,选择“设置/查看文件”,查看所有保存到你电脑里的Cookies.这些文件通常是以user@domain格式命名的,user是你的本 ...
- 从WebBrowser中取得Cookie 和 WebClient设置cookie!
原文:从WebBrowser中取得Cookie 和 WebClient设置cookie! 从WebBrowser中取得Cookie 的代码 CookieContainer myCookieContai ...
- 通过cookie记录,设置页面访问的跳转页
通过cookie记录,设置页面访问的跳转页 转载自:http://blog.csdn.net/yixiao_naihe/article/details/26679515. 目的: 1.访问fm.htm ...
- 怎么设置cookie,怎么设置cookie以及删除cookie和cookie详解
在操作cookie之前,先来看一下cookie长什么样. 可以看到,cookie是一个个键值对(“键=值”的形式)加上分号空格隔开组合而成, 形如: "name1=value1; name2 ...
- 随手记一次利用webbowser控件打开网页后cookie读取与设置
利用wininet.dll 组件读取cookie : [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError ...
- Laravel5 cookie和session设置
Cookies Laravel会加密所有已创建的cookie信息,并附加上授权码,当客户端擅自修改cookie信息时,该cookie将被废弃,从而保证安全性. 获取一个指定的cookie值 $valu ...
- Cookie获取、设置值
设置: HttpCookie cookie = new HttpCookie("cookieName"); cookie.Value = "name1" Htt ...
- cookie值的设置,获取及删除
<script> function setCookie( key, val, expire){ var dateTime = new Date(); dateTime.setTime( d ...
随机推荐
- 用CentOS 7打造合适的科研环境
http://seisman.info/linux-environment-for-seismology-research.html 这篇博文记录了我用CentOS 7搭建地震学科研环境的过程,供我个 ...
- SharePoint缓存导致访问慢解决
产品发布到公网时,客户每次访问页面都很慢,经过查找原因,发现在服务器上的APPFabric缓存出错误了: APPFabric缓存服务作用:用作内存中缓存来存储应用程序访问的数据,从而提高应用程序性能. ...
- 比较ASP生成静态HTML文件的几种方法
将动态页面转换生成静态Html文件有许多好处,比如生成html网页有利于被搜索引擎收录(特别是对接受动态参数的页面).前台访问时,脱离了数据访问,减轻对数据库访问的压力,加快网页打开速度. 当然,凡事 ...
- Java与Android开发环境配置以及遇到的问题解决
0 概述 所有文章涉及的下载地址在文章下方会有汇总,所有软件的版本最好与系统版本一致 建议安装安卓开发软件至一个目录中,以方便查找 1 Java环境配置 1.1 JDK下载: 据说JDK6用的比较多, ...
- mysqlimport 导入文件到数据库命令
mysqlimport -h 172.16.145.125 -u ocetl -pocetl test --fields-terminated-by='|' '/home/ocetl/tmp_use ...
- MFC多视图共用一文档实现
项目过程中有定制视图的需求,具体为打开程序默认双视图并且共用一个文档.在网上找了许多类似的资料,都不尽完善.本文直接从达到目的的角度叙述,实现原理不再多说. 1.在自己的App类中定义public变量 ...
- ios Trace xcode buile count
前言: 1.记录xcode编辑次数很有必要,特别是在频繁发版本时和根据现有编译次数记录估算工期时间很有帮助 2.全部自动化处理,告别手动时代 正文: 1.新建工程或者现有工程里设置: 然后设置xcod ...
- IOS开发之NSObject协议类方法说明
oc中NSObject类是所有类的基类,所有类都要继承自它,那么它的方法就显得特别重要,因为所有类都会有这些基本的方法. 看看oc的源码中NSObject是这样定义的: @interface NSOb ...
- 初学C++,开博第一篇
几个维度相同的数组转置算法,这两种完全相同://注意:如果维度不同,转置会出错误,因为下标会越界...解决办法是把数组的维度调齐,或者是写到另一新数组中. for(int i=0;i<row;i ...
- Yii 通过widget小物件生成添加表单
通过widget小物件创建添加商品的表单 视图里,表单以endWidget();?>结束 最终效果: 把表单提交过来的信息保存到数据库中去. 补充要点: 密码表单: <?php echo ...