只有在php以apache的模块方式运行的时候才可以使用http认证的功能。在apache的模块php脚本中,可以使用header()函数向客户断浏览器发送一个”authentication required”的消息,使浏览器弹出一个用户名/密码(username/password)的输入窗口,当用户输入用户名和密码后,包含php脚本的url将会被再次调用,使用分别代表用户名,密码,和确认方式的$php_auth_user, $php_auth_pw,$php_auth_type变量。现在只有”basic”的确认方式被支持。
在一个页面中强迫用户进行身份认证的代码段的例子如下:
example 2-1. http 认证举例:
<?php
if(!isset($php_auth_user)) {
header("www-authenticate: basic realm=\"my realm\"");
header("http/1.0 401 unauthorized");
echo "text to send if user hits cancel button\n";
exit;
}
else {
echo "hello $php_auth_user.<p>";
echo "you entered $php_auth_pw as your password.<p>";
}
?>
除了简单的输出$php_auth_user 和 $php_auth_pw变量的值以外,你还可以检查用户名和密码的合法性,也许是对数据库进行查询,也许是在dbm文件中搜索用户。
当心臭虫成堆的internet explorer浏览器,他对hearders的顺序非常挑剔.所以采用在送出http/1.0 401 header 请求之前送出www-authenticate header请求是一个很好的解决方法。
为了阻止一些人写一些脚本来显示一个经过传统外部机制验证过的页面的密码,采用如下方式:如果这一页面使用外部验证机制,将不会生成php_auth变量.这样,$remote_user变量可以被用来表示已经被外部机制验证的用户.
注意,上面的方法并不能防止某些人在同一台服务器上利用无身份验证的url偷取有身份鉴别的url的密码。
无论netscape还是ie,在接到服务器的401回复之后,都将清空本地浏览器窗口的身份验证缓存。这种做法可以有效的使用户登录退出,从而强迫他们再次输入他们的用户名和密码。一些人使用这个方式来实现“超时”注册,或者提供登录退出的按钮。
这种方法不是标准的http基本身份鉴定所必须的,所以您可能从来都不依靠它。使用lynx进行的测试并没有弄清楚401服务器回应的身份鉴定,所以如果使用“向前”或“向后”功能将打开源文件(只要信用需求还没有被改变)。
虽然已经指出这种语言不能工作在microsoft的iis服务器上,但是php语言cgi版本将受到iis的限制。
