第四章 会话与 Cookies |
Top Previous Next |
第四章 会话与 Cookies 本章主要讨论会话和有状态的Web应用的内在风险。你会首先学习状态、cookies、与会话;然后我会讨论关于cookie盗窃、会话数据暴露、会话固定、及会话劫持的问题及防范它们的方法。 正如大家知道的,HTTP是一种无状态的协议。这说明了两个HTTP请求之间缺乏联系。由于协议中未提供任何让客户端标识自己的方法,因此服务器也就无法区分客户端。 虽然HTTP无状态的特性还是有一些好处,毕竟维护状态是比较麻烦的,但是它向需要开发有状态的Web应用的开发人员提出了前所未有的挑战。由于无法标识客户端,就不可能确认用户是否已登录,在购物车中加入商品,或者是需要注册。 一个最初由网景公司构思的超强解决方案诞生了,它就是被命名为cookies的一种状态管理机制。Cookies是对HTTP协议的扩充。更确切地说,它们由两个HTTP头部组成:Set-Cookie响应头部和Cookie请求头部。 当客户端发出对一个特定URL的请求时,服务器会在响应时选择包含一个Set-Cookie头部。它要求客户端在下面的请求中包含一个相就的Cookie头部。图4-1说明了这个基本的交互过程。
图4-1. 两个HTTP事务间Cookie的完整交互过程
如果你根据这个基本概念在每一个请求中包含同一个唯一标识码(在cookie头部中),你就能唯一标识客户端从而把它发出的所有请求联系起来。这就是状态所要求的,同时也是这一机制的主要应用。
小提示 迄今为止,最好的cookies使用指南依然是网景公司提供的规范,网址是:http://wp.netscape.com/newsref/std/cookie_spec.html 。它是最类似和接近于全行业支持的标准。
基于会话管理的概念,可以通过管理每一个客户端的各自数据来管理状态。数据被存储在会话存储区中,通过每一次请求进行更新。由于会话记录在存储时有唯一的标识,因此它通常被称为会话标识。
如果你使用PHP内建的会话机制,所有的这些复杂过程都会由PHP为你处理。当 你调用函数session_start()时,PHP首先要确认在本次请求中是否包含会话标识。如果有的话,PHP就会读取该会话数据并通过$_SESSION超级公用数组提供给你。如果不存在,PHP会生成一个会话标识并在会话存储区建立一个新记录。PHP还会处理会话标识的传递并在每一个请求时更新会话存储区。图4-2演示了这个过程。
虽然这很简便有效,但最重要的还是要意识到这并不是一个完整的解决方案,因为在PHP的会话机制中没有内建的安全处理。除此之外,由于会话标识是完全随机产生的,因此是不可预测的。你必须自行建立安全机制以防止所有其它的会话攻击手段。在本章中,我会提出一些问题,并提供相应的解决方案。
|