存在两种类型的cookie:
Session cookies - these are temporary and are erased when you close your browser at the end of your surfing session. The next time you visit that particular site it will not recognise you and will treat you as a completely new visitor as there is nothing in your browser to let the site know that you have visited before
不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。
Persistent cookies - these remain on your hard drive until you erase them or they expire. How long a cookie remains on your browser depends on how long the visited website has programmed the cookie to last
设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。
存储在硬盘上的cookie 可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie ,不同的浏览器有不同的处理方式。
session 是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器端,通过SessionID来区分不同的客户,session是以Cookie 或URL重写为基础。默认使用Cookie来实现,系统会创造一个名为JSESSIONID的输出Cookie,或称为 " Session Cookie " ,以区别Persistent Cookies(通常所说的Cookie) . Session Cookie 是存储在浏览器中,并不是写在硬盘上的,但是把浏览器的Cookie禁止后,使用response对象的encodeURL或 encodeRedirectURL方法编码URL,WEB服务器会采URL重写的方式传递Sessionid,用户就可以在地址栏看到 jsessionid = A09JHGHKHU68624309UTY84932之类的字符串。
通常Session Cookie是不能跨窗口使用 , 当用户新开了一个浏览器进入相同的页面时,系统会赋予用户一个新的SessionID,这样信息共享的目的就达不到,此时可以把SessionID保存在 Persistent Cookie中,然后再新的窗口中读出来,就可以得到上一个窗口的SessionID了,这样通过Session Cookie和 Persistent Cookie的结合,实现了跨窗口的会话跟踪。
session的工作原理
就session的实现而言,好像是这样的:
( 1 )当有Session启动时,服务器生成一个唯一值,称为SessionID(好像是通过取进程ID的方式取得的)。
( 2 )然后,服务器开辟一块内存,对应于该SessionID。
( 3 )服务器再将该SessionID写入浏览器的cookie(一些在网页的源代码中有所体现)。
( 4 )服务器内有一进程,监视所有Session的活动状况,如果有Session超时或是主动关闭,服务器就释放该内存块。
( 5 )当浏览器连入IIS(服务器)时并请求的ASP(脚本语言)内用到Session时,IIS(服务器)就读浏览器Cookie中的SessionID。
( 6 )然后,服务检查该SessionID所对应的内存是否有效。
( 7 )如果有效,就读出内存中的值。
( 8 )如果无效,就建立新的Session。
注意:
( 1 )在大浏览量的网站,Session并不保险,我们过去的网站就经常碰到存在Session中得值不正确(可能出现重复的Session ID)。
( 2 )Session ID不能从硬盘上的Cookie文件获得,如果想在客户端获知自己的Session ID,只能通过Javascrīpt来读取。
Cookie和会话状态
做BS开发,这两个概念必不可少,先来个大概了解,没有实际应用很难深入,深入看参考地址!
什么是 Cookie?
Cookie 是一小段文本信息 ,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。用户每次访问站点时,Web 应用程序都可以读取 Cookie 包含的信息。 Cookie 的基本工作原理如果用户再次访问站点上的页面,当该用户输入 URLwww .*****. com时,浏览器就会在本地硬盘上查找与该 URL 相关联的 Cookie 。如果该 Cookie 存在,浏览器就将它与页面请求一起发送到您的站点。
Cookie 有哪些用途 ?
最根本的用途是 : Cookie 能够帮助 Web 站点保存有关访问者的信息。更概括地说,Cookie 是一种保持Web 应用程序连续性(即执行“状态管理”)的方法 . 使 Web 站点记住您 .
什么是会话Session?
当用户访问您的站点时,服务器会为该用户创建唯一的会话,会话将一直延续到用户访问结束。
参考地址
http : // www.microsoft.com/china/MSDN/library/archives/library/dv_vstechart/html/vbtchaspnetcookies101.asp
http : // support.microsoft.com/default.aspx?scid=kb;en-us;307598
cookie欺骗原理
正 如我们所知道的,在网络词汇中,cookie是一个特殊的信息,虽然只是服务器存于用户计算机上的一个文本文件,但由于其内容的不寻常性(与服务器有一定 的互交性,且常会存储用户名,甚至口令,或是其它一些敏感信息,例如在江湖或是一些社区中,常会用cookie来保存用户集分,等级等等)。因而成为一些 高手关注的对象,借此来取得特殊权限,甚至攻克整个网站。以下是自己在xp , 2003上做过的测试关于javascrīpt中对cookie的应用。
一、cookie的建立
在讲如何建立cookie之前,我们先来了解一下cookie的基本格式:
cookiename + cookievalue;expire = expirationdategmt;path = urlpath;domain = sitedomain
其中各项以;分开,首先是指定cookie的名称,并为其赋值。接下来分别是cookie的有效期,url路径以及域名,在这几项中,除了第一项以外,其它部分均为可先项。
我们来看一段代码,了解一下cookie究竟是怎样建立的:
< HTML >< HEAD >< TITLE > Set a cookie based on a form </ TITLE >
< scrīpt LANGUAGE = javascrīpt >
<!--
expireDate = new Date ;
expireDate . setMonth(expireDate . getMonth() + 6 );
userName = "" ;
if (document . cookie != "" ) {
userName = document . cookie . split ( " = " )[ 1 ];
}
function nameField_onblur() {
var userName;
userName = document . myform . nameField . value;
document . cookie = " userName= " + userName + " ;expires= " + expireDate . toGMTString();
alert(document . cookie);
}
// -->
</ scrīpt ></ HEAD >
< BODY BGCOLOR = " WHITE " ōnLoad = " document.myform.nameField.value = userName " >
< form NAME = " myform " >
< H1 > Enter your name :
< INPUT TYPE = " TEXT " NAME = " nameField " ōnBlur = " return nameField_onblur() " ></ H1 >
</ form ></ BODY ></ HTML >
1 ,< scrīpt LANGUAGE = " java scrīpt " TYPE = " TEXT/javascrīpt " >
脚本开始的标记,由此一句告诉浏览器以下将是javascrīpt .
2 ,<!-- Hide scrīpt from older browsers
为了防止浏览器不能识别脚本,而让浏览器误以为是HTML注释而忽略它。
3 ,expireDate = new Date
获取当前日期,并存入变量expireDate中。
4 ,expireDate . setMonth(expireDate . getMonth() + 6 )
获取当前月份值,将其加6后设置为expireDate的月份总值部分。这意味着本cookie的有效期为6个月。
5 , if (document . cookie != "" )
如果document的值不为空,相当于检查用户硬盘上是否已经有了cookie。
6 ,userName = document . cookie . split ( " = " )[ 1 ]
此处用到了split( " = " )函数,它的功能是把cookie记录分割为数组,cookie的名为cookie[ 0 ] , 值为cookie[ 1 ] , 以此类推。所以此处document . cookie . split ( " = " )[ 1 ]返回的值是此cookie的值。在此句中将值赋给了变量userName。
7 , function nameField_onblur()()
设置名为nameField_onblur()的函数。
8 ,document . cookie = " userName= " + userName + " ;expires= " + expireDate . toGMTString()
此句是将设置好的cookie写入用户硬盘。expireDate . toGMTString()把expireDate中的值转换为文本字符串,这样才能写入cookie中。
9 ,onLoad = " document.myform.nameField.value = userName "
当页面载入时,把username的值写入文本框(如果有的话)。
10 ,onBlur = " nameField_onblur() "
当用户离开文本框时,onBlur调用函数nameField_onblur()。
既然我们可以建立cookie,那么读取也不是什么难事,请接着往下看 !
二、读取和显示cookie
一般来说,cookie的作者并不希望cookie被显示出来,这是当然的 ! 天知道里面写了些什么 ! ?然而这也是我们想要读出它的原因 !~~~: D
< HTML >< HEAD >< TITLE > Cookie Check </ TITLE ></ HEAD >
< BODY BGCOLOR = " WHITE " >
< H2 >
< scrīpt LANGUAGE = javascrīpt >
<!-- Hide scrīpt from older browsers
var thisCookie;
if (document . cookie == "" ) {
document . write( " There are no cookies here " );
}
else {
thisCookie = document . cookie . split ( " ; " );
for (i = 0 ; i < thisCookie . length; i ++ ) {
document . write( " Cookie'length is " + thisCookie . length + " <br> " );
document . write( " Cookie name is ’ " + thisCookie[i] . split ( " = " )[ 0 ]);
document . write( " ’, and the value is ’ " + thisCookie[i] . split ( " = " )[ 1 ] + " ’<BR> " );
}
}
// End hiding scrīpt -->
</ scrīpt >
</ H2 ></ BODY ></ HTML >
以上的便是一段读取cookie的名字和值的脚本。上文中解释过的语句在此不多赘述,且看有什么新的语法:
1 ,thisCookie = document . cookie . split ( " ; " )[注意:并非前文中出现过的split( " = " )。
split ( " ; " )可以产生数组的结果,本句中,由document . cookie . split ( " ; " )来获取cookie的值,并将这个数组赋值。
2 , for (i = 0 ; i < thisCookie . length; i ++ )
设置计算器变量i的值为0,如果其值小于thisCookie . length(thisCookie中值的个数),将i的值加1。
3 ,document . write( " Cookie name is ’ " + thisCookie[i] . split ( " = " )[ 0 ])
此句中thisCookie[i] . split ( " = " )[ 0 ]较难理解,上面的脚本中,thiscookie已经被赋值为一个数组的值,那么 thisCookie[i]是指数组中第i个值,也就是第i个cookie,而由上文可知split( " = " )[ 0 ]是指cookie的名字。
这样thisCookie[i] . split ( " = " )[ 0 ]便是第i的cookie中cookie的名字 !
4 , document . write( " ’, and the value is ’ " + thisCookie[i] . split ( " = " )[ 1 ]
跟3极为相似,即是第i个cookie中 cookie的值。
到此,我们已经熟悉了如何建立cookie以及它的读取。这些也正是cookie欺骗也需要的主要技术 !
三、cookie欺骗的实现
要做到cookie欺骗,最重要的是理解目标cookie中的储值情况,并设法改变它。由上面的学习我们知道,基于cookie的格式所限,一般来说,只有在Cookie . split ( " = " )[ 0 ]和Cookie . split ( " = " )[ 1 ]中的值对我们才是有用的。也就是说只需改变这两处或是处的值即可达到我们的目的。
而在实际操作中,还得先解决另一个问题。由于受浏览器的内部cookie机制所限,每个cookie只能被它的原服务器所访问 ! 可我们总不能跑到人家服务器上操作吧 ! 这里就需要一个小技巧了。
在上面我们提到过cookie的格式,最后两项中分别是它的url路径和域名。不难想到,服务器对cookie的识别靠的就是这个 !
而在平时,我们要浏览一个网站时,输入的url便是它的域名,需要经过域名管理系统dns将其转化为IP地址后进行连接的。这其中就有一个空当。如果能在dns上做手脚,把目标域名的IP地址对应到其它站点上,我们便可以非法访问目标站点的cookie了 !
做到这一点并不难,当然我不并不是要去操纵dns,而且那也是不可能的事情。在xp , 2003下的C : /WINDOWS/system32/drivers/etc,有一名为hosts的文件,以文本方式打开后会看到这样的格式:
127.0 . 0.1 lockhost # 注释
利用它,我们便可以实现域名解析的本地化 ! 而且其优先权高于网络中的dns !
具体使用时,只需将IP和域名依上面的格式添加,存为hosts即可 ! (注意:此文件无后缀名)
到此,cookie欺骗所需的所以知识已经齐备。下面以一个“假”的例子,演示一下如何进入实战 . (不便给出真实地址,以免引起犯罪 !~~~: P)
假设目标站点是www . xxx . com
www . self . com是自己的站点。(可以用来存放欺骗目标所需的文件,用来读取和修改对方的cookie . )
首先ping出www . self . com的IP地址:
ping www . self . com
Reply from 12.34 . 56.78 : bytes = 32 time = 20ms TTL = 244
然后修改hosts文件如下:
12.34 . 56.78 www . xxx . com
并保存为hosts。
将用来读取cookie的页面传至www . self . com(脚本如二所示)。
此时连上www . xxx . com。由于我们已经对hosts动过手脚,这时来到的并不是www . xxx . com,而是www . self . com
www . xxx . com设在本地的cookie便可被读出 !~~: D
然后根据具体情况修改一的脚本,用同样的方法,向此cookie中写入数据。修改完毕后,恢复hosts文件,再重新进入www . xxx . com,此时已经大功告成,可享受你的hack成果了 !~~~: )
编后
cookie欺骗是一种发现较早,且较难使用的hack手法,除了javascrīpt 可以控制以外,asp等也可以用来对其进行设置。所以在此声明,未必能对所有站点有效。但技术真实,无须置疑 !