cookies - QLGQ/learning-python GitHub Wiki

Introduction

Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于规范RFC6265。(可以叫做浏览器缓存)。

Cookie在计算机中是个存储在浏览器项目中的文本文件,当浏览器运行时,存储在RAM中发挥作用(此种Cookies称作sion Cookies),一旦用户从该网站或服务器退出,Cookie可存储在用户本地的硬盘上(此种Cookies称作Persistent Cookies)。

通常情况下,当用户结束浏览器会话时,系统将终止所有的Cookie。当Web服务器创建了Cookies后,只要在其有效期内,当用户访问同一个Web服务器时,浏览器首先要检查本地的Cookies,并将其原样发送给Web服务器。这种状态称作“persistent client state http cookie”,简称为Cookies。

Related Technology

Cookie是在HTTP协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie是由Web服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时用户链接到服务器,Web站点都可以访问Cookie信息。

目前有些Cookie是临时的,有些则是持续的。临时的Cookie只在浏览器上保存一段规定的时间,一旦超过规定的时间,该Cookie就会被系统清除。持续的Cookie则保存在用户的Cookie文件中,下次用户返回时,仍然可以对它进行调用。在Cookie文件中保存Cookie,有些用户担心Cookie中的用户信息被一些别有用心的人窃取,而造成一定的损害。**其实,网站以外的用户无法跨过网站来获得Cookie信息。**如果因为这种担心而屏蔽Cookie,肯定会因此拒绝访问许多站点页面。因为,当今有许多Web站点开发人员使用Cookie技术,例如Session对象的使用就离不开Cookie的支持。

Function Features

  1. 在同一个页面中设置Cookie,实际上是从后往前的顺序进行的。如果要先删除一个Cookie,再写入一个Cookie,则必须先写写入语句,再写删除语句,否则会出现错误。
  2. Cookie是面向路径的。缺省路径(path)属性时,Web服务器页会自动传递当前路径给浏览器,指定路径强制服务器使用设置的路径。在一个目录页面里面设置的Cookie在另一个目录的页面里是看不到的。
  3. Cookie必须在HTML文件的内容输出之前设置;不同的浏览器(Netscape Navigator、Internet Explorer)对Cookie的处理不一致,使用时一定要考虑;客户端用户如果设置禁止Cookie,则Cookie不能建立。并且在客户端,一个浏览器能创建的Cookie数量最多为300个,并且每个不能超过4KB,每个Web站点能设置的Cookie总数不能超过20个。

Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于JSP而言也可以直接写入jsessionid,这样服务器可以知道该用户是否是合法用户以及是否需要重新登陆等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

Cookie的安全级别包括组织所用Cookie,接受所有Cookie,中级,和高级。
使用cookie实现单点登录

Recognization

如果在一台计算机中安装多个浏览器,每个浏览器都会在各自独立的空间存放cookie。因为cookie中不但可以确认用户,还能包含计算机和浏览器的信息,所以一个用户用不同的浏览器登录或者用不同的计算机登录,都会得到不同的cookie信息,另一方面,对于在同一台计算机上使用同一浏览器的多用户群,cookie不会区分他们的身份,除非他们使用不同的用户名登录。

Script Attack

尽管cookie没有病毒那么危险,但它仍包含了一些敏感信息:用户名,计算机名,使用的浏览器和曾经访问的网站。用户不希望这些内容泄漏出去,尤其是当其中还包含有私人信息的时候。

这并非危言耸听,一种名为跨站点脚本攻击(Cross site scripting)可以达到此目的。通常跨站点脚本攻击往往利用网站漏洞在网站页面中植入脚本代码或网站页面引用第三方法脚本代码,均存在跨站点脚本攻击的可能,在受到跨站点脚本攻击时,脚本指令将会读取当前站点的所有 Cookie 内容(已不存在 Cookie 作用域限制),然后通过某种方式将 Cookie 内容提交到指定的服务器(如:AJAX)。一旦 Cookie 落入攻击者手中,它将会重现其价值。

建议开发人员在向客户端 Cookie 输出敏感的内容时(譬如:该内容能识别用户身份):

  1. 设置该 Cookie 不能被脚本读取,这样在一定程度上解决上述问题。
  2. 对 Cookie 内容进行加密,在加密前嵌入时间戳,保证每次加密后的密文都不一样(并且可以防止消息重放)。
  3. 客户端请求时,每次或定时更新 Cookie 内容(即:基于第2小条,重新加密)
  4. 每次向 Cookie 写入时间戳,数据库需要记录最后一次时间戳(防止 Cookie 篡改,或重放攻击)。
  5. 客户端提交 Cookie 时,先解密然后校验时间戳,时间戳若小于数据数据库中记录,即意味发生攻击。

Application

服务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。Cookies最典型的应用是判定注册用户是否已经登录网站,用户可能会的到提示,是否在下一次进入网站时保留用户信息以便简化登录手续,这些都是Cookies的功能。另一个重要应用场合是“购物车”之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookies,以便在最后付款时提取信息。

Cookie 的用途之一是存储用户在特定网站上的密码和 ID。另外,也用于存储起始页的首选项。在提供个人化查看的网站上,将要求你的网络浏览器利用你计算机硬驱上的少量空间来储存这些首选项。这样,每次你登录该网站时,你的浏览器将检查你是否就该唯一的服务器有任何预先定义的首选项(cookie)。如果有的话,浏览器将此 cookie 随你对网页的请求一起发送给服务器。Microsoft 和 Netscape 使用 cookie 在其网站上创建个人起始页。各家公司利用 cookie 的一般用途包括:在线定货系统、网站个人化和网站跟踪。
网站个人化是 cookie 最有益的用途之一。例如,当谁来到 CNN 网站,但并不想查看任何商务新闻。网站允许他将该项选为关闭选项。从那时起(或者直到 cookie 逾期),他在访问 CNN 网页时将不会读到商务新闻。

Life Cycle

Cookie可以保持登录信息到用户下次与服务器的会话,换句话说,下次访问同一网站时,用户会发现不必输入用户名和密码就已经登录了(当然,不排除用户手工删除Cookie)。而还有一些Cookie在用户退出会话的时候就被删除了,这样可以有效保护个人隐私。
Cookie在生成时就会被指定一个Expire值,这就是Coo接的生存周期,在这个周期内Cookie有效,超出周期Cookie就会被清除。有些页面将Cookie的生存周期设置为“0”或负值,这样在关闭浏览器时,就马上清除Cookie,不会记录用户信息,更加安全。

How To Work

文档的HTML代码中的命令行告诉浏览器设置某一名称或数值的cookie。以下是用来设置cookie脚本的一个普通实例。

Set-Cookie: name = VALUE;
expires = DATE;
path = PATH;
domain = DOMAIN_NAME;

那么安全性如何?HTTP Cookie 不能用来从阁下的硬驱上检索个人数据、放置病毒、得到阁下的电子邮件地址或偷窃有关阁下身份的敏感信息;然而,HTTP Cookie 可用来跟踪阁下在特定网站上的所到之处。不使用 cookie 就很难进行网站跟踪。
至于其他一切与因特网有关的事,如同阁下所希望的那样是匿名的。没有网站知道阁下是谁,除非阁下自己透露给网站。同时,cookie 只是为了更好地了解使用模式并改进网站访客的效率而采用的一个网站跟踪统计手段而已。
如果网站设计师旨在使网页能与访客更具互动作用,或者若设计师计划让访客自定义网站的外观,则就需要使用 cookie。而且,如果阁下想要网站在某些情况下改变其外观,cookie 则提供了一条快速、容易的途径,让阁下的 HTML 页面按需要而改变。最新型的服务器使用 cookie 有助于数据库的互动性,进而改进网站的整体互动性。