您的位置:首页 > 其它

cookie 和session 的区别详解

2014-06-09 00:00 246 查看
这些都是基础知识,不过有必要做深入了解。先简单介绍一下。

二者的定义:

当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,

都纪录下来。当下次你再光临同一个网站,WEB 服务器会先看看有没有它上次留下的 Cookie 资料,有的话,就会依据 Cookie

里的内容来判断使用者,送出特定的网页内容给你。 Cookie 的使用很普遍,许多有提供个人化服务的网站,都是利用 Cookie

来辨认使用者,以方便送出使用者量身定做的内容,像是 Web 接口的免费 email 网站,都要用到 Cookie。

具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。

同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制

来达到保存标识的目的,但实际上它还有其他选择。

cookie机制。正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示

浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。而cookie的使用

是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围

大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。

cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这

个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。

会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie

保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏

览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式

session机制。session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识

(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来

使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相

关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应

中返回给客户端保存。保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给

服务器。一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时

仍然能够把session id传递回服务器。

经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器

会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如:
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
<input type="text">
</form>
实际上这种技术可以简单的用对action应用URL重写来代替。

cookie 和session 的区别:

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5、所以个人建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中

使用Session对象保存信息的代码如下:


//存放信息


Session["username"]="zhouhuan";


//读取数据


string UserName=Session["username"].ToString();

使用Cookie对象保存的代码如下:


//存放信息


Response.Cookies["UserID"].Value="0001";


//读取信息


string UserID=Response.Cookies["UserID"].Value;

一、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.baidu.com是自己的站点。(可以用来存放欺骗目标所需的文件,用来读取和修改对方的cookie.)

首先ping出www. baidu.com的IP地址:

ping www. baidu.com

Reply from 123.123.11.11: bytes=32 time=20ms TTL=244

然后修改hosts文件如下:

123.123.11.11 www.xxx.com

并保存为hosts。

将用来读取cookie的页面传至www. baidu.com(脚本如二所示)。

此时连上www.xxx.com。由于我们已经对hosts动过手脚,这时来到的并不是www.xxx.com,而是www. baidu.com

www.xxx.com设在本地的cookie便可被读出!~~:D

然后根据具体情况修改一的脚本,用同样的方法,向此cookie中写入数据。修改完毕后,恢复hosts文件,再重新进入www.xxx.com,此时已经大功告成,可享受你的hack成果了!~~~:)

编后

cookie欺骗是一种发现较早,且较难使用的hack手法,除了javascrīpt 可以控制以外,asp等也可以用来对其进行设置。所以在此声明,未必能对所有站点有效。但技术真实,无须置疑!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: