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