zoukankan      html  css  js  c++  java
  • Cookie工作原理

    Cookie和会话状态的工作原理及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等也可以用来对其进行设置。所以在此声明,未必能对所有站点有效。但技术真实,无须置疑!

    http://www.cnblogs.com/joeliu/archive/2008/01/10/1033232.html

    Cookies基础   
      Cookies是web站点放置到你的硬盘上的程序。它们驻留在你的计算机上收集关于你在因特网上所做的一切事情的信息,并且web站点可以在任何时候读取到Cookies收集到的所有信息。   
      在新闻中这样定义是公平的,问题是,这个定义中没有一个是正确的,Cookies不是程序,它不能象程序一样能做很多事,因此它们自己不能收集任何信息,也不能收集关你你的机器的任何信息。   
        
      这里有一个关于Cookies的比较恰当的定义:   
        
      一个Cookies是web服务器存放在用户硬盘的一段文本,Cookies允许一个wen站点在用户的机器存放一些文本的信息,并可以在以后重新获取它。这个基于文本的信息存储着一些“键-值”对。   
        
      举个例子,一个web站点要为每一个来访者建立一个唯一的ID号码,并且将这个号码存储到每个来访者的机器的Cookies中。   
        
      如果你用微软的IE浏览一个web,你能够在你的硬盘看到你机器上的所有的Cookies,通常它们会驻留在目录c:/windows/cookies (win98),或者C:/Documents   and   Settings/user   name/Cookies(win2000,win   xp)   下面,当我看我的机器的这个目录的时候,我发现有165个文件。每个都是一个包含了“键-值”对的文本文件,每个站点都有一个Cookies文件。   
        
      你能够看到这个目录中的每一个文件都是一个简单的,普通的文本文件,你能够通过文件名看到是哪个web站点在你的机器放置了Cookies(这个信息也保存在了文件内容中),你可以打开每个文件查看其内容。   
        
      例如,我已经访问过了站点   goto.com,这个站点就会在我的机器上放置一个Cookie,这个Cookie文件的名字叫goto.com,包含下面的信息:   
      UserID   A9A3BECE0563982D   www.goto.com/站点   goto.com已经在我的机器上放置了一个单个的“键-值”对,键的名字是   UserID,键的值是   A9A3BECE0563982D,我第一次访问goto.com站点,站点分配了一个唯一的ID给我并把这个ID存放到了我的机器。   
        
      大多数的站点仅仅只在你的机器存放一个用户ID的Cookie,但这不是限制,一个站点可以在你的机器存放许多的“键-值”对,只要它喜欢。   
        
      Cookies文件只包含这些简单的“键-值”对的文本,、它不是程序,因此它不能“做”任何事情,一个web站点只能重新取得它自己放置到你硬盘的信息,它不能从其它的Cookies文件中取得信息,也不能看到你的机器的任何别的东西

    Cookies数据如何移动   
        
      正如你在以上章节中看到的,Cookie数据是简单的web站点放置在你的硬盘上的“键-值”对的文本,所有的Cookies文件都是如此。Web站点保存这些数据,然后又可以取回来,一个web站点只能取回它自己存放在你机器的数据,不能看到其它的Cookie,也不能看到你机器上的其它任何东西。   
        
      Cookie数据按照下面的方式移动:   
        

    1. 如果你在你的浏览器中输入了web的URL,浏览器会象这个URL的web站点发送请求,比如,你在浏览器中输入一下URL:http: //www.verizon.com,浏览器会将请求发送到Verizon的web服务器,请求它的首页。  
    2.  当浏览器发送请求时,它会查看你机器上跟域名www.verizon.com有关的Cookie文件,如果存在同www.verizon.com有关的 Cookie,浏览器就会把相关的Cookie“键-值”对数据跟请求一起发送到服务器,如果不存在同www.verizon.com有关的 Cookie,则浏览器不发送Cookie到服务器。  
    3. Verizon的web服务器收到Cookies数据和一个页面的Http请求,如果收到了Cookie“键-值”对,Verizon的web服务器将能够使用它们。  
    4. 如果没有收到Cookie“键-值”对,Verizon的web服务器就能知道你以前没有访问过这个站点,服务器建立一个新的用户ID,并在把你所请求的 页面发回到你的浏览器时,把用户ID“键-值”对发送到你的机器,你的硬盘就会驻留了对应这个站点的“键-值”对Cookie。  
    5. web服务器可以在你访问站点时,随时的更改“键-值”对或者加入一个新的“键-值”对。  
    6. 同“键-值”对发送到客户端的还有同这个“键-值”对相关的一些其它信息,其中之一就是Cookie有效期,另一个就是路径(为了在同一个站点的不通部分关联不同的Cookie)。  

        
      你能够控制这个过程,你可以在你的浏览器中设置当web站点向你的机器发送Cookie时你是接受还是拒绝。

    Web站点怎么使用Cookies     
        
      Cookies得到发展是因为它解决了谁在访问某个站点这个大问题,广义的理解,Cookies允许一个站点在你的机器上保存状态信息,这个信息让web 站点记住你的浏览器在什么状态,一个userID这个简单的“键-值”对可以让web站点知道你以前访问过这个站点,状态就是“你的浏览器至少访问过这个站点一次”,并且,站点从这次访问可以得知你的user   ID。   
        
      Web站点通过许多不通的方法来使用Cookies,下面是一些例子:     
       

    1. 站点能够精确的知道有多少访问者在实际的访问站点,它能排除哪些因为代理服务器,缓冲器,集中器等等带来的干扰,正确统计站点访问数的唯一方法是为每一个 来访者设置一个唯一的ID,并存在Cookie中,用Cookie,站点能够:  
    2. 决定有多少访问者到达。  
    3. 决定多少新的访客,多少是再次造访者。  
    4. 确定一个访问者访问的频度  

        
      web站点要做到这些是通过使用一个数据库,一个来访者第一次到来,站点在数据库中建立一个新的user   ID,并且将这个user   ID做为Cookie发送到客户端,这个用户下次再次访问这个站点,站点将会在数据库中同这个用户关联的user   ID   记录中增加访问次数,因此也知道了此用户多久访问一次。     
        
        为了查看每个用户的不同之处,站点可以存储用户的参数,比如,一些站点提供改变内容、布局、颜色设置的能力,它或者能够根据你的邮政编码提供定制的天气信息。   
        
      大多数的站点似乎都象这样的在站点数据库中保存用户参数,在Cookie中除了存储一个user   ID别的信息都没有,但是要在“键-值”对中存储一个实际的值还有另外一个方法:     
        
        电子商务站点能够实现类似购物蓝和快速付款这些功能,用包含user   ID的Cookie来跟踪客户并将不同的商品放入你的购物蓝中,你放入购物蓝的每一个商品都将存放在数据库中同你的user   ID相关的记录中,当你付款时,站点知道你都采购了哪些商品。若是没有Cookie或者类似的技术,将不可能实现上述的功能。   
        
      在所有的这些例子中,注意,数据库被用来存储你在站点中选择的商品,你浏览过的页面,你在表单中提供的信息等等,所有的信息都被保存在站点的数据库中,只有你的user   ID是存储在客户端的Cookie中用以辨识用户的身份。
       
    Cookies的问题   
        
        
      Cookies不是一种理想的状态机,但是它的确能够做到许多别的方式不能做到的事,下面是Cookies的一些缺点:   

    1. 人们经常共同使用一台机器   ――   在公共场合使用的任何机器,和在办公室使用的或在家中使用的许多机器都是多人共享的机器。让我们来看你正在使用一台多人使用的机器(例如,在图书馆的机 器)在一个网上商店购买商品,商店的网站将会在这个机器上留下你的一些设置信息,其后又有别人用这台机器到这个网上商店购买商品,这个网站将会提供的是你 的一些设置。  
    2. Cookies   被删除   ――   如果你的浏览器出来问题而寻求技术支持的时候,技术支持者要你做的第一件事就是要求你首先删除你机器上的所有internet临时文件,当你这样做后,你 将丢掉你的所有的Cookies文件。当你再次访问某个站点时,站点将会想你是个新的用户并给你一个新的user   ID,你以前在这个站点设置的一些个性设置也将不在存在。  
    3. 使用多个机器   ――   人们在一天之内经常使用不止一台机器,比如,在办公室使用一台机器,在家又使用一台机器,在路上可能使用到笔记本电脑。这样在三台机器上将会用三个不通的 Cookie,同一个人在三台机器上将会被做为三个用户分别对待。 
  • 相关阅读:
    金额转换问题
    进制转换(十进制->二进制、八进制、十六进制)
    Linux下Tomcat的安装
    Linux下安装jdk配置java环境变量
    Linux下安装Mysql
    在Linux下安装Redis
    Redis常用操作
    阿里云服务器部署tomcat服务器无法访问
    mysql 创建数据库 编码
    docker 安装oracle
  • 原文地址:https://www.cnblogs.com/xiarongjin/p/8317656.html
Copyright © 2011-2022 走看看