关于Cookie安全性设置的那些事
- 一、标题:关于Cookie安全性设置的那些事
副标:httponly属性和secure属性解析
二、引言
经常有看到XSS跨站脚本攻击窃取cookie案例,修复方案是有httponly。今天写出来倒腾下...
2.1首先必须的预备cookie知识。假如你第一次认识cookie,请先阅读这篇文章:
js于cookies.zip、google cookie.
三、Cookie属性
cookie内容,如图所示:
HTTP response header:
Set-Cookie: <name>=<value>[; <Max-Age>=<age>][; expires=<date>][; domain=<domain_name>]=[; path=<some_path>][; secure][; HttpOnly]
1 2 3 4 5 6 7
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
12response.setHeader(
"Set-Cookie"
, "cookiename=value;
Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");
private static final String CUSTOM_SESSION_ID = "YONGBOYID";
private static final String HTTP_ONLY = "HttpOnly";
private static final String SECURE = "secure";
private static final String SET_COOKIE = "Set-Cookie";public void setHttpOnly(HttpServletResponse hResponse,HttpServletRequest hRequest){
if (hResponse.containsHeader(SET_COOKIE)) {
// 为会话Cookie添加HttpOnly
String sessionId = hRequest.getSession().getId();
String cookieValue = CUSTOM_SESSION_ID + "=" + sessionId + ";Path="
+ hRequest.getContextPath() + ";" + SECURE+ ";" + HTTP_ONLY;
hResponse.setHeader(SET_COOKIE, cookieValue);
}
}具体参数的含义再次不做阐述,设置完毕后通过js脚本是读不到该cookie的,但使用如下方式可以读取
1Cookie cookies[]=request.getCookies();
C#
123HttpCookie myCookie =
new
HttpCookie(
"myCookie"
);
myCookie.HttpOnly =
true
;
Response.AppendCookie(myCookie);
VB.NET
123Dim myCookie As HttpCookie =
new
HttpCookie(
"myCookie"
)
myCookie.HttpOnly = True
Response.AppendCookie(myCookie)
但是在.NET 1.1 ,中您需要手动添加
1Response.Cookies[cookie].Path +=
";HTTPOnly"
;
Servlet3
只需要在web.xml中添加如下片段:
123456<session-config>
<cookie-config>
<http-only>
true
</http-only>
<secure>
true
</secure>
</cookie-config>
</session-config>
在PHP中,cookie的HttpOnly有两种设置方式。
1234方法一:
header(
"Set-Cookie:tmp=100;HttpOnly"
);
方法二:
setcookie(
"tmp"
,
100
, NULL, NULL, NULL, NULL, TRUE);
PHP4
1header(
"Set-Cookie: hidden=value; httpOnly"
);
PHP5
1setcookie(
"abc"
,
"test"
, NULL, NULL, NULL, NULL, TRUE); 最后一个参数为HttpOnly属性
五、深挖
问:为什么设置了httponly-cookie盗窃的威胁并没有彻底消除?
答:因为httponly作用只是限制从其他非HTTP的API(如JavaScript)访问,cookie还是有可能传递的过程中被监听捕获后信息泄漏。
我查阅了msdn,它上面这么说的:
将 HttpOnly 属性设置为 true,并不能防止对网络频道具有访问权限的攻击者直接访问该 Cookie。工作站的安全也很重要,原因是恶意用户可能使用打开的浏览器窗口或包含持久性 Cookie 的计算机,以合法用户的标识获取对网站的访问。
setcookie("tmp", 100, NULL, NULL, NULL, TRUE, TRUE);【https】
6 7
总结下:
增多 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
个人之拙见,不妥之处还望斧正。Luolired
转自http://www.2cto.com/Article/201304/200529.html
关于Cookie安全性设置的那些事的更多相关文章
- cookie和session的那些事
对于经常网购的朋友来说,经常会遇到一种情况: 打开淘宝或京东商城的首页,输入个人账号和密码进行登陆,然后进行购物,支付等操作都不需要用户再次输入用户名和密码 但是如果用户换一个浏览器或者等几个小时后再 ...
- flask设置cookie,设置session,模拟用户认证、模拟管理后台admin、模拟用户logout
设置cookie HTTP协议是无状态的,在一次请求响应结束后,服务器不会留下关于客户端状态的信息.但是对于某些web程序来说,客户端的信息有必要被记住,比如用户的登录状态,这样就可以根据用户的状态来 ...
- [DabaBase] MongoDB (6) 启动、停止、相关系统配置及安全性设置
MongoDB 启动.停止.相关系统配置及安全性设置 启动MongoDB ./mongod —-help 查看帮助说明 mac-abeen:bin abeen$ sudo ./mongod --dbp ...
- JS读写Cookie(设置、读取、删除)
JS读写Cookie(设置.读取.删除) Cookie是客户端存放数据的一种方式,可用来做状态保持. 1.设置Cookie: a.无过期时间:(若不设置过期时间,默认为会话级Cookie,浏览器关闭就 ...
- Cookie 简单设置使用
cookie的理解可以为,存放在用户浏览器上的一个文件,里面是键值对数据,用于跟服务端通讯.前端可以通过jquery cookie插件设置和读取,后端直接设置 1.获取Cookie: 1 2 3 4 ...
- Cookie中设置了 HttpOnly,Secure 属性,有效的防止XSS攻击,X-Frame-Options 响应头避免点击劫持
属性介绍: 1) secure属性当设置为true时,表示创建的 Cookie 会被以安全的形式向服务器传输(ssl),即 只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证, 如果是 HT ...
- js封装Cookie操作 js 获取cookie js 设置cookie js 删除cookie
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code var CookieUtil = { // 设置cookie set : functi ...
- iOS UIWebView 和 WKWebView 的 cookie 获取,设置,删除
Cookie简介说到Cookie,或许有些小伙伴会比较陌生,有些小伙伴会比较熟悉.如果项目中,所有页面都是纯原生来实现的话,一般Cookie这个东西或许我们永远也不会接触到.但是,这里还是要说一下Co ...
- 20180909 解析JS Cookie的设置,获取和检索
引用: JavaScript Cookie - by runoob.com Cookie是储存在电脑文本文件中的数据,用于保存访问者的信息,并可以在下次打开页面时引用. 页面在设置/引用访问者信息时, ...
随机推荐
- BroadcastReceiver简单应用实例
BroadcastReceiver是android四大组件之一,主要用于接收广播,它的简单实现方法如下: 1.定义继承BroadcastReceiver的MyReceiver类: /** * Crea ...
- 如何在 FineUIMvc 中引用第三方 JavaScript 库
声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 引入第三方颜色选择器 在 FineUIMvc 中使用第三方 JavaScript 遵循一定的约定,也非常简单. 下面以官网示例为 ...
- 学习MVC之租房网站(三)-编写实体类并创建数据库
在上一篇<学习MVC之租房网站(二)-框架搭建及准备工作>中,搭建好了项目框架,并配置了EF.Log4Net和进程外Session.接下来会编写Eneity类并采用CodeFirst的方式 ...
- MyRocks DDL原理
最近一个日常实例在做DDL过程中,直接把数据库给干趴下了,问题还是比较严重的,于是赶紧排查问题,撸了下crash堆栈和alert日志,发现是在去除唯一约束的场景下,MyRocks存在一个严重的bug, ...
- sql中常见日期获取
获取当前年月日 --获取当前月份 ,GETDATE())) --获取当前月份的下个月 ,GETDATE())) --获取当前月份的上个月 year()获取年 select year(GETDATE() ...
- Jmeter自动化测试工具的简单使用--HTTP测试
Jmeter自动化测试工具的简单应用 1.安装Jmeter 链接: https://pan.baidu.com/s/1mhSzU68 密码: 446z 到这里下载 1.1 jmeter 将下载好的 ...
- mapTask并行度优化及源码分析
mapTask并行度的决定机制 一个job的map阶段并行度由客户端在提交job时决定,而客户端对map阶段并行度的规划的基本逻辑为:将待处理数据执行逻辑切片(即按照一个特定切片大小,将待处理数据划分 ...
- mysql 优化方法
1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽 ...
- webrtc学习笔记1(建立连接基本流程)
最近在做一个基于webrtc的视频软件,以下是自己对于上层建立通话连接流程的基本理解,记录于此. 假设A和B要建立视频通话,A为房间创建端,B为加入房间端: 1.A通过http登录.获取其他服务器地址 ...
- java 无法连接ftp服务器(500 OOPS: cannot change directory)
在使用java连接ftp服务器时可能会出现无法连接的情况,检查代码是没有错误的,这时就应该考虑一下服务器端的情况了: 首先用在本地打开命令窗口,输入:ftp ftp服务器IP,窗口会提示你输入用户名密 ...