cookie
Cookie是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。用户每次访问站点时,Web 应用程序都可以读取 Cookie 包含的信息。
假设在用户请求访问您的网站 a rel="nofollow" href=".contoso/" target="_blank".contoso/a 上的某个页面时,您的应用程序发送给该用户的不仅仅是一个页面,还有一个包含日期和时间的 Cookie。用户的浏览器在获得页面的同时还得到了这个 Cookie,并且将它保存在用户硬盘上的某个文件夹中。
以后,如果该用户再次访问您站点上的页面,当该用户输入 URL a rel="nofollow" href=".contoso/" target="_blank".contoso/a 时,浏览器就会在本地硬盘上查找与该 URL 相关联的 Cookie。如果该 Cookie 存在,浏览器就将它与页面请求一起发送到您的站点,您的应用程序就能确定该用户上一次访问站点的日期和时间。您可以根据这些信息向用户发送一条消息,也可以检查过期时间或执行其他有用的功能。
Cookie 是与 Web 站点而不是与具体页面关联的,所以无论用户请求浏览站点中的哪个页面,浏览器和服务器都将交换 a rel="nofollow" href=".contoso/" target="_blank".contoso/a 的 Cookie 信息。用户访问其他站点时,每个站点都可能会向用户浏览器发送一个 Cookie,而浏览器会将所有这些 Cookie 分别保存。
以上就是 Cookie 的基本工作原理。那么,Cookie 有哪些用途呢?最根本的用途是 Cookie 能够帮助 Web 站点保存有关访问者的信息。更概括地说,Cookie 是一种保持 Web 应用程序连续性(即执行“状态管理”)的方法。浏览器和 Web 服务器除了在短暂的实际信息交换阶段以外总是断开的,而用户向 Web 服务器发送的每个请求都是单独处理的,与其他所有请求无关。然而在大多数情况下,都有必要让 Web 服务器在您请求某个页面时对您进行识别。例如,购物站点上的 Web 服务器跟踪每个购物者,以便站点能够管理购物车和其他的用户相关信息。因此 Cookie 的作用就类似于名片,它提供了相关的标识信息,可以帮助应用程序确定如何继续执行。
使用 Cookie 能够达到多种目的,所有这些目的都是为了使 Web 站点记住您。例如,一个实施民意测验的站点可以简单地利用 Cookie 作为布尔值,表示您的浏览器是否已经参与了投票,从而避免您重复投票; 而那些要求用户登录的站点则可以通过 Cookie 来确定您是否已经登录过,这样您就不必每次都输入凭据。 Cookie 的限制
在开始讨论 Cookie 的技术细节之前,我想先介绍一下 Cookie 应用的几条限制。大多数浏览器支持最多可达 4096 字节的 Cookie,如果要将为数不多的几个值保存到用户计算机上,这一空间已经足够大,但您不能用一个 Cookie 来保存数据集或其他大量数据。在实际应用中,您可能并不希望在 Cookie 中保存大量的用户信息,而只希望保存用户编号或其他标识符。之后,当用户再次访问您的站点时,您就可以使用该用户 ID 在数据库中查找用户的详细信息。(有关保存用户信息的说明,请参阅 Cookie 和安全性。)
浏览器还限制了您的站点可以在用户计算机上保存的 Cookie 数。大多数浏览器只允许每个站点保存 20 个 Cookie。如果试图保存更多的 Cookie,则最先保存的 Cookie 就会被删除。还有些浏览器会对来自所有站点的 Cookie 总数作出限制,这个限制通常为 300 个。
您最可能遇到的 Cookie 限制是:用户可以设置自己的浏览器,拒绝接受 Cookie。您很难解决这个问题,除非完全不使用 Cookie 而是通过其他机制来保存用户相关信息。保存用户信息的一种常用方法是会话状态,但会话状态又依赖于 Cookie。这一点在后面的 Cookie 和会话状态中阐述。
更一般的经验很可能是,尽管 Cookie 在应用程序中非常有用,应用程序也不应该依赖于能够保存 Cookie。利用 Cookie 可以做到锦上添花,但不要利用它们来支持关键功能。如果您的应用程序必须使用 Cookie,则您可以通过测试来确定浏览器是否接受 Cookie。我在本文后面的检查浏览器是否接受 Cookie 一节中简单介绍了一种测试方法。 Cookie 与安全性
在使用 Cookie 时,您必须意识到其固有的安全弱点。我所指的安全性并不是隐私问题,正如我在前面的什么是 Cookie?中所述,隐私在更大程度上是某些用户面对的问题:这些用户很关心 Cookie 中的信息是如何被使用的。而 Cookie 的安全性问题与从客户机获取数据的安全性问题类似。对于初学者,就应用程序而言,Cookie 是用户输入的另一种形式,因而很容易被他人非法获取和利用。由于 Cookie 保存在用户自己的计算机上,所以用户至少可以看到您保存在 Cookie 中的信息。如果用户愿意,还能在浏览器向您发送 Cookie 之前修改该 Cookie。
所以,您千万不要在 Cookie 中保存保密信息 - 用户名、密码、信用卡号等等。在 Cookie 中不要保存不应该由用户掌握的内容,也不要保存可能被其他窃取 Cookie 的人控制的内容。
同样,要对从 Cookie 中得到的任何信息都持怀疑态度。不要认为得到的数据就是您当初设想的信息。处理 Cookie 值时采用的安全措施应该与处理 Web 页面中用户键入的数据时采用的安全措施相同。例如,在页面中显示值之前,我会对 Cookie 中的内容进行 HTML 编码。这是一种标准的方法,可以在显示之前净化从用户处得到的信息,对 Cookie 的处理与此相同。
另一个需要关心的问题是,Cookie 是以纯文本的形式在浏览器和服务器之间传送的,任何可以截取 Web 通信的人都可以读取 Cookie。您可以对 Cookie 的属性进行设置,使其只能在使用安全套接字层(SSL,又称 https://)的连接上传输。SSL 并不能防止保存在用户计算机上的 Cookie 被他人读取或操作,但它能防止 Cookie 在传输途中被他人截取。
面对这些安全问题,如何才能安全地使用 Cookie?您可以在 Cookie 中保存一些不重要的数据,如用户首选项或其他对应用程序没有重大影响的信息。如果确实需要把某些敏感信息(如用户 ID)保存在 Cookie 中,就对这些信息进行加密。