編寫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)文章
PHP數(shù)據(jù)庫(kù)操作Helper類完整實(shí)例
這篇文章主要介紹了PHP數(shù)據(jù)庫(kù)操作Helper類,詳細(xì)分析了php操作mysql的連接、增刪改查及關(guān)閉連接等步驟,并給出了完整的mysql操作類Helper供大家參考,需要的朋友可以參考下2016-05-05
php+ajax實(shí)現(xiàn)圖片文件上傳功能實(shí)例
目前常用的異步文件上傳功能有幾種,比較多見(jiàn)的如使用iframe框架形式,ajax功能效果,以及flash+php功能,需要的朋友可以參考下2014-06-06
解析百度搜索結(jié)果link?url=參數(shù)分析 (全)
自從9月后百度和360開(kāi)戰(zhàn)的結(jié)果就是 百度搜索結(jié)果的網(wǎng)址改變了,變成link?url=………這樣的重定向格式了??吹竭@樣的不友好的URL真有破解的沖動(dòng)。于是今天開(kāi)始試試破解它2012-10-10
PHP中使用SimpleXML檢查XML文件結(jié)構(gòu)實(shí)例
這篇文章主要介紹了PHP中使用SimpleXML檢查XML文件結(jié)構(gòu)實(shí)例,本文講解使用SimpleXML來(lái)檢查一個(gè)XML文件是否符合規(guī)范的方法,需要的朋友可以參考下2015-01-01
php中將數(shù)組轉(zhuǎn)成字符串并保存到數(shù)據(jù)庫(kù)中的函數(shù)代碼
為了方便可以把php的數(shù)組轉(zhuǎn)換為 字符串保存到數(shù)據(jù)庫(kù)中。當(dāng)需要用時(shí)就可以取出字符串再轉(zhuǎn)成數(shù)組即可。下為為php數(shù)組與字符串相互轉(zhuǎn)換的自定義函數(shù)2013-09-09
淺析php靜態(tài)方法與非靜態(tài)方法的用法區(qū)別
下面小編就為大家?guī)?lái)一篇淺析php靜態(tài)方法與非靜態(tài)方法的用法區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05

