正如我在本教程开始之前所讲的那样,cookies和sessions是两个截然不同的使得数据在客户端“持久化”的方法。session在session期间保持数据,而cookie可以保持数据到你需要的长的时间。请记住这一点,让我们现在看一个同时使用了它们两个的例子。
这里的应用是一个简单的用户认证系统,在该系统里,某些页面只能被成功登录系统的用户查看。没有通过有效密码验证的用户被拒绝访问这些“特殊”页面。有效的用户名和密码列表存储于一个MySQL数据库中,而PHP被用于验证用户的身份然后决定是否授权访问。
假定MySQL数据库表如下面所示一样
有唯一的用户名字段和使用SHA1()函数创建的密码字段,下面是做所有这些艰苦工作的PHP脚本:+-------+-----------------------------------------------+ | name | pass | +-------+-----------------------------------------------+ | sue | 9565d44fd0fe4db59f073eea1db70f3ea258e10b | | harry | 6e74234b8b552685113b53c7bff0f386c8cef8cf | | louis | 6817dda51b64b8190029490d2811a4d9cb9cd432 | | sam | bd17f8243e771a57cfbb06aa9a82bbf09fd2d90b | | james | 792ec9b44d432c947ac6775b2b52326e9d08512f | +-------+-----------------------------------------------+
这里,输入登录框的值被结合到MySQL SELECT查询语句中,该语句在用户表上执行。如果用户名和密码两个都匹配,那么唯一一个记录将会被返回,这意味着认证成功;如果它们不匹配,没有记录会被返回,这意味着认证失败。
假定认证成功,session被初始化,$_SESSION['auth']关键字被创建和被赋布尔真值,然后用户名被存储于cookie中以备下次使用。这个cookie将在30天内保持有效,而且被用于下次登录尝试时在登录框内提前填充用户名字段。
当然,这个本身还不是充分的。虽然上面的脚本执行认证然后在用户证明有效时初始化一个session和一个cookie,但是安全检查必须也在每个受限页面上执行。没有这个安全检查,任何用户都可以绕过该登录界面而且只要简单输入每个页面的准确的URL就可查看该页面。
如果用户证明被确认,那么session变量$_SESSION['auth']才可以存在,这一点在上面脚本中是清楚的,正因为如此,在每一受限页面的开始检查变量$_SESSION['auth']的存在与否而且如果该检查返回真则授权访问,这就足够了。下面的例子解释了其是如何实现的:
非常整洁?只有认证过的用户能够看到这个页面,因为只有这些用户的客户端才会有一个内有$_SESSION['auth']变量的session。其他认证的用户只看到一个错误的消息。<?php // start session session_start(); if (!$_SESSION['auth'] == 1) { // check if authentication was performed // else die with error die ("ERROR: Unauthorized access!"); } else { ?> <html> <head></head> <body> This is a secure page. You can only see this if $_SESSION['auth'] = 1 </body> </html> <?php } ?>
那就是本教程的所有内容。在第十一章,我将告诉你所有的关于SimpleXML---这个和PHP5一起绑定提供的新的XML处理工具箱。请一定要为了它回来!