通基本身份认证一样,也可以使用PHP网页处理HTTP请求报头字段来匹配摘要式身份验证信息。例如下边的代码使用header()函数要求客户端使用Digest验证,它在HTTP消息报头中增加了一个WWW-Authenticate字段:
header(\'WWW-Authenticate:Digest Realm=\"MyRealm\",nonce=\"47alf7cf25ce7\",algorithm=MD5,qop=\"auth\"\');
--------------------------------------------------------------------------------
下边代码描述的是一个使用摘要式身份验证的网页(首先取消Apache验证配置)。
<?php
$realm=\"MyRealm\";
//如果没有验证信息,则发送报头要求浏览器使用摘要式身份验证
if(!isset($_SERVER[\'PHP_AUTH_DIGEST\'])){
header(\"WWW-Authenticate:Digest Realm=/\"$realm/\",nonce=/\"\".uniqid().\"/\",algorithm=MD5,qop=/\"auth/\"\");
header(\"HTTP/1.0 401 Unauthorization Required\");
echo \"账号/密码错误!\";
exit;
}else{
//使用函数http_digest_parse解析验证信息
$data=http_digest_parse($_SERVER[\"PHP_AUTH_DIGEST\"]);
if(!$data){
header(\"HTTP/1.0 401 Unauthorization Required\");
echo \"账号/密码错误!\";
exit;
}else{
//根据HTTP协议,自己构建一个response值
$A1=md5(\'admin:\'.$realm.\':password\');
$A2=md5($_SERVER[\'REQUEST_METHOD\'].\':\'.$data[\'uri\']);
$valid_response=
md5($A1.\':\'.$data[\'nonce\'].\':\'.$data[\'nc\'].\':\'.$data[\'cnonce\'].\':\'.$data[\'qop\'].\':\'.$A2);}
//将自己构建的response值与浏览器构建并发送过来的response值对比,如果相同那么就证明用户名和密码输入是正确的
if($data[\'response\']==$valid_response){
echo \"验证通过!\";
}else{
header(\"HTTP/1.0 401 Unauthorization Required\");
echo(\"账号/密码错误!\");
exit;
}
}
function http_digest_parse($digest_str){
$needed_parts=array(\'nonce\'=>1,\'nc\'=>1,\'cnonce\'=>1,\'qop\'=>1,\'username\'=>1,\'uri\'=>1,\'response\'=>1);
//使用正则表达式解析Authorization报头的内容
preg_match_all(\'@(/w+)=([/\'\"]?)([a-zA-Z0-9=.//_-]+)/2@\',$digest_str,$result,PREG_SET_ORDER);
//将结果填充$data数组,并返回
$data=array();
foreach($result as $m){
$data[$m[1]]=$m[3];
unset($needed_parts[$m[1]]);
}
return $needed_parts?false:$data;
}
?>
本文地址:https://www.stayed.cn/item/12570
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我