HTTP Cookie学习

Cookie简介:

Cookie(复数形态Cookies),中文名称为小型文本文件或小甜饼,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。定义于RFC2109。是网景公司的前雇员Lou Montulli在1993年3月的发明。

概念:Cookie是web server下发给浏览器的任意的一段文本。在后续的http 请求中,浏览器会将cookie带回给Web Server。

Cookie作用:

因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。

在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。 所以Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态

在刚才的购物场景中,当用户选购了第一项商品,服务器在向用户发送网页的同时,还发送了一段Cookie,记录着那项商品的信息。当用户访问另一个页面,浏览器会把Cookie发送给服务器,于是服务器知道他之前选购了什么。用户继续选购饮料,服务器就在原来那段Cookie里追加新的商品信息。结帐时,服务器读取发送来的Cookie就行了。

如果没有Cookie:

  1. 每次访问都像第一次访问一样,无法判断用户是否访问过
  2. 任何的购买等交互、验证行为都必须在一次访问中完成
  3. 无任何记忆,均需要用户重新点击或填写

内存Cookie和硬盘Cookie

这个应该很好理解,一个是存在内存,一个存在硬盘。区别就在于Cookie的有效时间。

内存Cookie:由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。

硬盘Cookie:保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。

硬盘Cookie的用处:

登录一个网站时,网站往往会请求用户输入用户名和密码,并且用户可以勾选“下次自动登录”。如果勾选了,那么下次访问同一网站时,用户会发现没输入用户名和密码就已经登录了。这正是因为前一次登录时,服务器发送了包含登录凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登录时,(如果该Cookie尚未到期)浏览器会发送该Cookie,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。

Cookie分类:

1. Session Cooiek

这个类型的cookie只在会话期间内有效,即当关闭浏览器的时候,它会被浏览器删除。设置session cookie的办法是:在创建cookie不设置Expires即可。

2. Persistent Cookie

持久型cookie顾名思义就是会长期在用户会话中生效。当你设置cookie的属性Max-Age为1个月的话,那么在这个月里每个相关URL的http请求中都会带有这个cookie。所以它可以记录很多用户初始化或自定义化的信息,比如什么时候第一次登录及弱登录态等。

3. Secure cookie

安全cookie是在https访问下的cookie形态,以确保cookie在从客户端传递到Server的过程中始终加密的。这样做大大的降低的cookie内容直接暴露在黑客面前及被盗取的概率。

4. HttpOnly Cookie

目前主流的浏览器已经都支持了httponly cookie。1.IE5+ 2.Firefox 1.0+ 3.Opera 8.0+ 4.Safari/Chrome。在支持httponly的浏览器上,设置成httponly的cookie只能在http(https)请求上传递。也就是说httponly cookie对客户端脚本语言(javascript)无效,从而避免了跨站攻击时JS偷取cookie的情况。当你使用javascript在设置同样名字的cookie时,只有原来的httponly值会传送到服务器。

5. 3rd-party cookie

第一方cookie是cookie种植在浏览器地址栏的域名或子域名下的。第三方cookie则是种植在不同于浏览器地址栏的域名下。例如:用户访问a.com时,在ad.google.com设置了个cookie,在访问b.com的时候,也在ad.google.com设置了一个cookie。这种场景经常出现在google adsense,阿里妈妈之类的广告服务商。广告商就可以采集用户的一些习惯和访问历史。

6. Super Cookie

超级cookie是设置公共域名前缀上的cookie。通常a.b.com的cookie可以设置在a.b.com和b.com,而不允许设置在.com上,但是很不幸的是历史上一些老版本的浏览器因为对新增后缀过滤不足导致过超级cookie的产生。

Cookie的实现

传递流程:

以访问本站(www.kryptosx.info)为例。

这里使用Fiddler来进行HTTP抓包,用来分析交互时的Cookie是如何传递的。

第一步:

使用浏览器打开www.kryptosx.info,这是一个GET请求。

可以看出,第一次请求中,并没有Cookies的信息,但是返回包中,有Set-Code头,后面跟着的就是Cookies信息。

从图中可以看出,三个都是删除Cookie的—“=deleted”。Cookies是httponly的。另外,expires设置为1970年,这个cookie就成了所谓的session-cookie。因为浏览器会自动清理掉过期的Cookies。

第二步刷新这个网页:

这次依然是GET请求,但是带上了Cookie。

GET / HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: www.kryptosx.info
DNT: 1
Connection: Keep-Alive
Cookie: CNZZDATA1254085044=1980544601-1431063029-%7C1431063029

当然,返回包也带了Cookie。

总结:

从抓包中,可以看出HTTP交互时传递Cookies的方式。当然,我这里这个Cookie估计是访问统计的。

Cookies是一个浏览器和服务器交互的,并非依赖于单个网页。浏览器是对通过域来区分的。通过信息的附带我们也可以看得出,它和Post还是GET并无关系。

Cookie和跨站请求伪造(CSRF):

Cookies可以被看作是一个凭据,自然会被骇客窥视。只要窃取了它,攻击者就能冒充你的身份了。

可能某天,你收到一封邮件,它告诉你,你的XXX网账号有风险,请立刻修改。里面还有个链接,你发现链接没错,确实是XXX网的域名。你可能没注意,直接点开了。之后,你就发现你的XXX系统中的密码被改掉了。

这就是一个CSRF攻击,攻击者精心设计了一个网址。这个网址就附带了更改密码的GET请求。另外你的浏览器本地保存着XXX网的Cookies,所以操作是合法的。

CSRF还有别的手段,比如在某个网页里嵌入图片等,这类更为隐蔽。

解决方案:

CSRF看上去很可怕,但还是能解决的。当然这种东西不能靠用户,还是要网站开发者来搞定。

CSRF利用的是Cookies的特点,因为Cookies是浏览器级别的一个信息,同一个浏览器登录相同的网站的不同网页都能访问相同的Cookies。因此攻击者的请求对于浏览器来说是合法的,服务端没有做CSRF保护,也认为这个请求是合法,这样就被攻击了。

前面说了,Cookies是一个凭证,但是Cookies是浏览器级别的,同个浏览器都能用这个凭证,因此黑客也能利用。那我们能不能弄一个凭证,让黑客没法利用,不就解决了,接着这个例子,合法的修改密码操作是会先打开修改密码页面,输完要修改的密码,然后点击提交。而黑客是直接提交请求的,并没有打开修改密码页面这一步。

所以,目前防CSRF攻击的方法,大多都是在网页中加入一个Token,即把一个凭证放到页面里,这是页面级别的,黑客没法利用这个凭证,CSRF攻击也就难以进行了。

也有使用验证码的,这个当然更安全,此外,还有防暴力破解的能力,但是用户体验不大好。所以一般放在重要操作中,比如改密码这类:P。

另外,有人说用了Post就安全,Post相对GET而言确实要好点,毕竟伪造Post难度大点。但是千万别认为就能躲开CSRF了。JS脚本是能模拟Post请求的。所以该加Token还是加Token吧。



参考资料:http://www.webryan.net/2011/08/wiki-of-http-cookie/

时间: 2024-12-28 13:42:57

HTTP Cookie学习的相关文章

Cookie学习-------介绍

什么是 Cookie? Cookie是存储于访问者计算机中的变量. Cookie是Web服务器保存在用户计算机上等的文本文件的小块用户信息,每当用户访问Web服务器时,保存在用户计算机上的相关Cookie由客户端读取到服务器端,服务器端根据Cookie信息为用户制定服务. 例如:访问某个网站时在页面中体现用户登录次数等. Cookie的语法 set-Cookie:name=value;[exprise=date];[path=dir];[domain=domainname];[secure] C

Cookie学习笔记(三)

11.4.3  删除会话变量 在使用会话时,需要创建一个方法来删除会话数据.在当前示例中,当用户注销时,这是必要的. 虽然cookie系统只需要发送另一个cookie来销毁现有的cookie,但是会话的要求更高,因为既要考虑客户上的cookie,又要考虑服务器上的数据. 要删除单独一个会话变量,可以使用unset()函数(它可以处理PHP中的任何变量): unset($_SESSION['var']); 要删除每个会话变量,可以重置整个$_SESSION数组: $_SESSION = array

Cookie学习笔记(一)

Cookie 简介 一.简介     说起来,Cookie应该是一种应用较久的技术了.早在HTML刚刚出现的时候,在每个独立的页面之间没有办法记录和 标识不同的用户.后来人们就发明了Cookie技术,当用户访问网页时,它能够在访问者的机器上创立一个文件,我们把它叫作Cookie,写一段内容进去,来标识不同的用户.如果下次用户再访问这个网页的时候,它又能够读出这个文件里面的内容,这样网页就知道上次这个用户已经访问过该网页了.      虽然现在网页的制作技术比起几年以前已经发展了许多.不过有些时候

iOS Cookie学习(NSHTTPCookieStorage的使用)

最近也是忙里偷闲,无意中发现了一位大牛的文章,小小的研究了一下HTTP.今天先写一点Cookie,之前有过文章都是关于Cookie的,也没有深入研究,今天也算是一起学习吧. @interface FQWebGlobalCookies : NSObject /* 全局单例 */ + (id)globalCookiesManager; /* 对每份URL产生的Cookie 保存起来,以便管理 对响应头域中的cookie进行保存 */ - (void)storeResponseCookies:(NSD

Cookie学习笔记二:Cookie实例

今天说说刚刚学到的两个Cookie的最经典应用:自动登录和购物车设置 一:自动登录 需要两个页面:login.jsp与index.jsp,login.jsp用来输出登录信息,index.jsp处理登录信息:如果有Cookie,则自动登录,否则创建输入信息的对象的Cookie,下次登录可以直接登录,但是我们在这里给Cookie设置一个最大保存时间30s,即登录30s后会自动退回到登陆页面,具体代码如下: login.jsp: <%@ page language="java" con

Cookie学习

1-Cookie学习 目前大家对于浏览器和服务器的交互模式,以及请求的处理都有了理解,并且也能够进行请求的处理.本节课围绕整个流程再次进行技术优化,重点学习Cookie 技术,此技术的应用面是非常广的. Cookie学习 问题: HTTP 协议是没有记忆功能的,一次请求结束后,相关数据会被销毁.如果第二次的请求需要使用相同的请求数据怎么办呢? 难道是让用户再次请求书写吗? 解决: 使用Cookie 技术解释: Cookie 技术其实是浏览器端的数据存储技术,解决了不同请求需要使用相同的请求数据的

HTTP Cookie学习笔记

cookie是什么?是饼干,小甜点? No! No! No! 我今天要总结的cookie并不是你所想的小甜心,我这里要说的cookie是Web开发中的一个重要的"武器",每一个Web开发者的武器库中肯定要装备这门武器. cookie是浏览器存储在用户电脑上的一个文本文件,里面包含一些key=value格式的数据:浏览器按照一定的规范来管理和存储这些数据,并在之后的请求中将这些信息发送至服务器,服务器根据客户端传回的cookie数据进行用户识别.用户行为分析等操作.千言万语总结成一句话,

Cookie学习笔记

会话的概念: 打开浏览器,输入正确的URL访问服务器, 期间浏览器向服务器请求资源,服务器给予资源响应,最后关闭浏览器,客户端和浏览器的连接断开.这一过程可理解为会话. Cookie入门: Cookie是在服务器创建,保存在客户端.Cookie会在客户端保存一些用户的信心,比如浏览信息.在客户端没有删除一个站点的Cookie情况下,在下一次在访问该站点的时候会在请求头中带有Cookie信息发给服务器,以便于服务端做出更为合理的处理. 每个网站只能读取自己的Cookie,不能读取别的网站的Cook

js Cookie 学习笔记

<1>设置cookie <script type="text/javascript"> window.onload=function(){ document.cookie="myName=C_world"; } <script> <2>获取cookie <script type="text/javascript"> window.onload=function(){ var myName