編寫php應(yīng)用程序?qū)崿F(xiàn)摘要式身份驗(yàn)證的方法詳解
更新時(shí)間:2013年06月08日 09:16:49 作者:
本篇文章是對(duì)編寫php應(yīng)用程序?qū)崿F(xiàn)摘要式身份驗(yàn)證的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
通基本身份認(rèn)證一樣,也可以使用PHP網(wǎng)頁(yè)處理HTTP請(qǐng)求報(bào)頭字段來(lái)匹配摘要式身份驗(yàn)證信息。例如下邊的代碼使用header()函數(shù)要求客戶端使用Digest驗(yàn)證,它在HTTP消息報(bào)頭中增加了一個(gè)WWW-Authenticate字段:
header('WWW-Authenticate:Digest Realm="MyRealm",nonce="47alf7cf25ce7",algorithm=MD5,qop="auth"');
--------------------------------------------------------------------------------
下邊代碼描述的是一個(gè)使用摘要式身份驗(yàn)證的網(wǎng)頁(yè)(首先取消Apache驗(yàn)證配置)。
<?php
$realm="MyRealm";
//如果沒(méi)有驗(yàn)證信息,則發(fā)送報(bào)頭要求瀏覽器使用摘要式身份驗(yàn)證
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 "賬號(hào)/密碼錯(cuò)誤!";
exit;
}else{
//使用函數(shù)http_digest_parse解析驗(yàn)證信息
$data=http_digest_parse($_SERVER["PHP_AUTH_DIGEST"]);
if(!$data){
header("HTTP/1.0 401 Unauthorization Required");
echo "賬號(hào)/密碼錯(cuò)誤!";
exit;
}else{
//根據(jù)HTTP協(xié)議,自己構(gòu)建一個(gè)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);}
//將自己構(gòu)建的response值與瀏覽器構(gòu)建并發(fā)送過(guò)來(lái)的response值對(duì)比,如果相同那么就證明用戶名和密碼輸入是正確的
if($data['response']==$valid_response){
echo "驗(yàn)證通過(guò)!";
}else{
header("HTTP/1.0 401 Unauthorization Required");
echo("賬號(hào)/密碼錯(cuò)誤!");
exit;
}
}
function http_digest_parse($digest_str){
$needed_parts=array('nonce'=>1,'nc'=>1,'cnonce'=>1,'qop'=>1,'username'=>1,'uri'=>1,'response'=>1);
//使用正則表達(dá)式解析Authorization報(bào)頭的內(nèi)容
preg_match_all('@(/w+)=([/'"]?)([a-zA-Z0-9=.//_-]+)/2@',$digest_str,$result,PREG_SET_ORDER);
//將結(jié)果填充$data數(shù)組,并返回
$data=array();
foreach($result as $m){
$data[$m[1]]=$m[3];
unset($needed_parts[$m[1]]);
}
return $needed_parts?false:$data;
}
?>
header('WWW-Authenticate:Digest Realm="MyRealm",nonce="47alf7cf25ce7",algorithm=MD5,qop="auth"');
--------------------------------------------------------------------------------
下邊代碼描述的是一個(gè)使用摘要式身份驗(yàn)證的網(wǎng)頁(yè)(首先取消Apache驗(yàn)證配置)。
復(fù)制代碼 代碼如下:
<?php
$realm="MyRealm";
//如果沒(méi)有驗(yàn)證信息,則發(fā)送報(bào)頭要求瀏覽器使用摘要式身份驗(yàn)證
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 "賬號(hào)/密碼錯(cuò)誤!";
exit;
}else{
//使用函數(shù)http_digest_parse解析驗(yàn)證信息
$data=http_digest_parse($_SERVER["PHP_AUTH_DIGEST"]);
if(!$data){
header("HTTP/1.0 401 Unauthorization Required");
echo "賬號(hào)/密碼錯(cuò)誤!";
exit;
}else{
//根據(jù)HTTP協(xié)議,自己構(gòu)建一個(gè)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);}
//將自己構(gòu)建的response值與瀏覽器構(gòu)建并發(fā)送過(guò)來(lái)的response值對(duì)比,如果相同那么就證明用戶名和密碼輸入是正確的
if($data['response']==$valid_response){
echo "驗(yàn)證通過(guò)!";
}else{
header("HTTP/1.0 401 Unauthorization Required");
echo("賬號(hào)/密碼錯(cuò)誤!");
exit;
}
}
function http_digest_parse($digest_str){
$needed_parts=array('nonce'=>1,'nc'=>1,'cnonce'=>1,'qop'=>1,'username'=>1,'uri'=>1,'response'=>1);
//使用正則表達(dá)式解析Authorization報(bào)頭的內(nèi)容
preg_match_all('@(/w+)=([/'"]?)([a-zA-Z0-9=.//_-]+)/2@',$digest_str,$result,PREG_SET_ORDER);
//將結(jié)果填充$data數(shù)組,并返回
$data=array();
foreach($result as $m){
$data[$m[1]]=$m[3];
unset($needed_parts[$m[1]]);
}
return $needed_parts?false:$data;
}
?>
相關(guān)文章
海河寫的 Discuz論壇帖子調(diào)用js的php代碼
海河寫的 Discuz論壇帖子調(diào)用js的php代碼...2007-08-08php判斷兩個(gè)浮點(diǎn)數(shù)是否相等的方法
這篇文章主要介紹了php判斷兩個(gè)浮點(diǎn)數(shù)是否相等的方法,涉及php操作浮點(diǎn)數(shù)的技巧,比較實(shí)用,需要的朋友可以參考下2015-03-03PHP數(shù)組相加操作及與array_merge的區(qū)別淺析
這篇文章主要給大家介紹了關(guān)于PHP數(shù)組相加操作以及與array_merge的區(qū)別,文中通過(guò)示例介紹的很詳細(xì),感興趣的朋友們可以參考學(xué)習(xí),有需要的下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2016-11-11PHP的壓縮函數(shù)實(shí)現(xiàn):gzencode、gzdeflate和gzcompress的區(qū)別
這篇文章主要介紹了PHP的壓縮函數(shù)實(shí)現(xiàn):gzencode、gzdeflate和gzcompress的區(qū)別,需要的朋友可以參考下2016-01-01PHP如何得到當(dāng)前頁(yè)和上一頁(yè)的地址?
PHP如何得到當(dāng)前頁(yè)和上一頁(yè)的地址?...2006-11-11讓你的WINDOWS同時(shí)支持MYSQL4,MYSQL4.1,MYSQL5X
讓你的WINDOWS同時(shí)支持MYSQL4,MYSQL4.1,MYSQL5X...2006-12-12