一般地说,PHP脚本是跨平台的,但是基本身份验证的使用却依赖于服务器设置的环境变量。要在使用PHP作为Apache模块的Apache服务器或使用PHP作为ISAPI模块的IIS上运行一个HTTP身份验证脚本,需要检查服务器的类型并相应采取稍微不同的操作。
程序清单17-4所示的脚本可以在这两个服务器上运行。
程序清单17-4 http.php——PHP可以触发HTTP基本身份验证
<?php
//if we are using IIS,we need to set
//$_SERVER['PHP_AUTH_USER']and
//$_SERVER['PHP_AUTH_PW']
if((substr($_SERVER['SERVER_SOFTWARE'],0,9)=='Microsoft')&&
(!isset($_SERVER['PHP_AUTH_USER']))&&
(!isset($_SERVER['PHP_AUTH_PW']))&&
(substr($_SERVER['HTTP_AUTHORIZATION'],0,6)=='Basic')
){
list($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW'])=
explode(':',base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'],6)));
}
//Replace this if statement with a database query or similar
if(($_SERVER['PHP_AUTH_USER']!='user')||
($_SERVER['PHP_AUTH_PW']!='pass')){
//visitor has not yet given details,or their
//name and password combination are not correct
header('WWW-Authenticate:Basic realm="Realm-Name"');
if(substr($_SERVER['SERVER_SOFTWARE'],0,9)=='Microsoft'){
header('Status:401 Unauthorized');
}else{
header('HTTP/1.0 401 Unauthorized');
}
echo"<h1>Go Away!</h1>
<p>You are not authorized to view this resource.</p>";
}else{
//visitor has provided correct details
echo"<h1>Here it is!</h1>
<p>I bet you are glad you can see this secret page.</p>";
}
?>
程序清单17-4中给出的代码可以实现与本章前面的程序清单给出的代码实现的类似方法。
如果用户尚未提供身份验证信息,代码就会要求用户输入这些信息。如果用户提供的信息不正确,代码就给用户发送一个拒绝消息。如果提供的用户名、密码都正确,该代码就会显示网页的内容。
在这个例子中,用户将看到与前一个程序清单所不同的界面。我们不再提供要求输入注册信息的HTML表单。用户的浏览器将显示一个对话框。一些人认为这是一个改进;也有些人更喜欢对界面可视部分的完全控制。在这个例子中,由Firefox提供的登录对话框如图17-4所示。
图 17-4 使用HTTP基本身份验证时,用户浏览器负责显示该对话框因为该身份验证是通过内置于浏览器中的特性来实现的,因此浏览器将判断如何处理失败的身份验证。Internet Explorer在显示拒绝页面之前允许用户尝试验证3次。而Firefox则允许用户尝试无数次,每次尝试失败后都将出现一个对话框,询问“Authorization failed.Retry?(验证失败,是否需要重试?)”如果用户点击“取消”按钮,Firefox才会显示拒绝页面。
对于程序清单17-1和程序清单17-2给出的代码,我们可以将它们包含到要保护的网页里,或者将它们自动预先写入到某个目录的每个文件中。