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之安全设置漫谈

时间: 2024-12-28 05:59:17

COOKIE之安全设置漫谈的相关文章

怎么设置cookie,怎么设置cookie以及删除cookie和cookie详解

在操作cookie之前,先来看一下cookie长什么样. 可以看到,cookie是一个个键值对(“键=值”的形式)加上分号空格隔开组合而成, 形如: "name1=value1; name2=value2; name3=value3" 设置cookie: 1 /** 2 * 设置cookie 3 * @param name cookie的名称 4 * @param value cookie的值 5 * @param day cookie的过期时间 6 */ 7 var setCooki

封装cookie的获取,设置与查找

//获取cookiefunction getCookie(key,value){ var c = document.cookie; var str = key + '=' + value; var re = new RegExp('(^|\\s)'+str+';?($|\\s)'); return re.test(c);}//设置cookiefunction setCookie(key,val,time){ time = time?time:0; var data = new Date(); d

Cookie获取、设置值

设置: HttpCookie cookie = new HttpCookie("cookieName"); cookie.Value = "name1" HttpContext.Current.Response.Cookies.Add(cookie); 读取: HttpContext.Current.Request.Cookies["cookieName"].Value 判断cookie是否存在: if(HttpContext.Current.R

跨域请求cookie获取与设置问题

描述:最近做项目遇到了cookie的问题,项目为前后端分离项目,前台有分外网IP(A外)和内网IP(A内),后台服务只有一个内网IP(B内). 现象:当我前台异步请求发送给后台的时候,后台并不能获取到前台的cookie或者cookie获取的不对. 解释: 后台我需要获取A(外)这个域下的所有cookie,同时因为某种原因我客户端也是存在cookie的,但是当前台页面,访问后台服务时,请求携带的时B(内)所在域下的cookie,因此获取不到指定cookie值,因此服务出错. 结论:获取cookie

HTTP请求的python实现(urlopen、headers处理、 Cookie处理、设置Timeout超时、 重定向、Proxy的设置)

## python实现HTTP请求的三中方式:urllib2/urllib.httplib/urllib 以及Requests urllib2/urllib实现 urllib2和urllib是python两个内置的模块,要实现HTTP功能,实现方式是以urllib2为主,urllib为辅 1 首先实现一个完整的请求与响应模型 urllib2提供基础函数urlopen, import urllib2 response = urllib2.urlopen('http://www.cnblogs.co

Cookie由谁设置、怎么设置、有什么内容?

Cookie是由服务器生成,保存在客户端本地的一个文件,通过response响应头的set-Cookie字段进行设置,下面是一个示例: Cookie包含什么信息? 它可以记录你的用户ID.密码.浏览过的网页.停留的时间等信息.当你再次来到该网站时,网站通过读取Cookies,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID.密码就直接登录等等.一个网站只能读取它自己放置的信息,不能读取其他网站的Cookie文件.因此,Cookie文件还保存了host属性,即

原生js封装cookie获取、设置及删除

使用cookie(key,value,options) 参数key,value,options(可选) function cookie(key,value,options){ if(typeof value !== "undefined"){//write options=options||{} var cookie=encodeURIComponent(key)+"="+encodeURIComponent(value); if (typeof options.e

JS设置cookie,删除cookie(引)

JS设置cookie,删除cookie(引) js设置cookie有很多种方法. 第一种:(这个是w3c官网的代码) <script> //设置cookie function setCookie(cname, cvalue, exdays) { var d = new Date(); d.setTime(d.getTime() + (exdays*24*60*60*1000)); var expires = "expires="+d.toUTCString(); docum

Cookie安全漫谈

在 Web 应用中,Cookie 很容易成为安全问题的一部分.从以往的经验来看,对 Cookie 在开发过程中的使用,很多开发团队并没有形成共识或者一定的规范,这也使得很多应用中的 Cookie 成为潜在的易受攻击点.在给 Web 应用做安全架构评审(Security architecture review)的时候,我通常会问设计人员以下几个问题: 你的应用中,有使用 JavaScript 来操作客户端 Cookie 吗?如果有,那么是否必须使用 JavaScript 才能完成此应用场景?如果没