IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁(yè)網(wǎng)絡(luò)編程PHP編程 → 在PHP中實(shí)現(xiàn)用戶身份認(rèn)證兩種方法

在PHP中實(shí)現(xiàn)用戶身份認(rèn)證兩種方法

時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)

用戶在設(shè)計(jì)和維護(hù)站點(diǎn)的時(shí)候,經(jīng)常需要限制對(duì)某些重要文件或信息的訪問(wèn)。通常,我們可以采用內(nèi)置于Web于HTTP協(xié)議的用戶身份驗(yàn)證機(jī)制。當(dāng)訪問(wèn)者瀏覽受保護(hù)頁(yè)面時(shí),客戶端瀏覽器會(huì)彈出對(duì)話窗口要求用戶輸入用戶名和密碼,對(duì)用戶的身份進(jìn)行驗(yàn)證,以決定用戶是否有權(quán)訪問(wèn)頁(yè)面。下面用兩種方法來(lái)說(shuō)明其實(shí)現(xiàn)原理。

一、用HTTP標(biāo)頭來(lái)實(shí)現(xiàn)

標(biāo)頭是服務(wù)器以HTTP協(xié)議傳送HTML信息到瀏覽器前所送出的字串。HTTP采用一種挑戰(zhàn)/響應(yīng)模式對(duì)試圖進(jìn)入受密碼保護(hù)區(qū)域的用戶進(jìn)行身份驗(yàn)證。具體來(lái)說(shuō),當(dāng)用戶首次向Web器發(fā)出訪問(wèn)受保護(hù)區(qū)域的請(qǐng)求時(shí),挑戰(zhàn)進(jìn)程被啟動(dòng),服務(wù)器返回特殊的401標(biāo)頭,表明該用戶身份未經(jīng)驗(yàn)證。客戶端瀏覽器在檢測(cè)到上述響應(yīng)之后自動(dòng)彈出對(duì)話框,要求用戶輸入用戶名和密碼。用戶完成輸入之后點(diǎn)擊確定,其身份識(shí)別信息就被傳送到服務(wù)端進(jìn)行驗(yàn)證。如果用戶輸入的用戶名和密碼有效,WEB服務(wù)器將允許用戶進(jìn)入受保護(hù)區(qū)域,并且在整個(gè)訪問(wèn)過(guò)程中保持其身份的有效性。相反,若用戶輸入的用戶名稱或密碼無(wú)法通過(guò)驗(yàn)證,客戶端瀏覽器會(huì)不斷彈出輸入窗口要求用戶再次嘗試輸入正確的信息。整個(gè)過(guò)程將一直持續(xù)到用戶輸入正確的信息位置,也可以設(shè)定允許用戶進(jìn)行嘗試的最大次數(shù),超出時(shí)將自動(dòng)拒絕用戶的訪問(wèn)請(qǐng)求。

PHP腳本中,使用函數(shù)header()直接給客戶端的瀏覽器發(fā)送HTTP標(biāo)頭,這樣在客戶端將會(huì)自動(dòng)彈出用戶名和密碼輸入窗口,來(lái)實(shí)現(xiàn)我們的身份認(rèn)證功能。在PHP中,客戶端用戶輸入的信息傳送到服務(wù)器之后自動(dòng)保存在 $PHP_AUTH_USER,$PHP_AUTH_PW,以及 $PHP_AUTH_TYPE這三個(gè)全局變量中。利用這三個(gè)變量,我們可以根據(jù)保存在數(shù)據(jù)文件或者數(shù)據(jù)庫(kù)中用戶帳號(hào)信息來(lái)驗(yàn)證用戶身份!

不過(guò),需要提醒使用者注意的是:只有在以模塊方式安裝的PHP中才能使用$PHP_AUTH_USER,$PHP_AUTH_PW,以及 $PHP_AUTH_TYPE這三個(gè)變量。如果用戶使用的是CGI模式的PHP則無(wú)法實(shí)現(xiàn)驗(yàn)證功能。在本節(jié)后附有PHP的模塊方式安裝方法。

下面我們用MySQL數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)用戶的身份。我們需要從數(shù)據(jù)庫(kù)中提取每個(gè)帳號(hào)的用戶名和密碼以便與$PHP_AUTH_USER和$PHP_AUTH_PW變量進(jìn)行比較,判斷用戶的真實(shí)性。

首先,在MySQL中建立一個(gè)存放用戶信息的數(shù)據(jù)庫(kù)

數(shù)據(jù)庫(kù)名為XinXiKu ,表名為user;表定義如下:

以下為引用的內(nèi)容:

create table user(

ID INT(4) NOT NULL AUTO_INCREMENT,

name VARCHAR(8) NOT NULL,

password CHAR(8) NOT NULL,

PRIMARY KEY(ID)

)

說(shuō)明:

1、ID為一個(gè)序列號(hào),不為零而且自動(dòng)遞增,為主鍵;

2、name為用戶名,不能為空;

3、password為用戶密碼,不能為空;

以下是用戶驗(yàn)證文件login.php

以下為引用的內(nèi)容:

﹤?PHP//判斷用戶名是否設(shè)置

if(!isset($PHP_AUTH_USER)) {

header("WWW-Authenticate:Basic realm="身份驗(yàn)證功能"");

header("HTTP/1.0 401 Unauthorized");

echo "身份驗(yàn)證失敗,您無(wú)權(quán)共享網(wǎng)絡(luò)資源!";

exit();

}

/*連接數(shù)據(jù)庫(kù)*/

$db=mysql_connect("localhost","root","");

//選擇數(shù)據(jù)庫(kù)

mysql_select_db("XinXiKu",$db);

//查詢用戶是否存在

$result=mysql_query("SELECT * FROM user where name='$PHP_AUTH_USER' and password='$PHP_AUTH_PW'",$db);

if ($myrow = mysql_fetch_row($result)) {

//以下為身份驗(yàn)證成功后的相關(guān)操作
...

} else {

//身份驗(yàn)證不成功,提示用戶重新輸入

header("WWW-Authenticate:Basic realm="身份驗(yàn)證功能"");

header("HTTP/1.0 401 Unauthorized");

echo "身份驗(yàn)證失敗,您無(wú)權(quán)共享網(wǎng)絡(luò)資源!";

exit();

}

?>

程序說(shuō)明:

在程序中,首先檢查變量$PHP_AUTH_USER是否已經(jīng)設(shè)置。如果沒(méi)有設(shè)置,說(shuō)明需要驗(yàn)證,腳本發(fā)出HTTP 401錯(cuò)誤號(hào)頭標(biāo),告訴客戶端的瀏覽器需要進(jìn)行身份驗(yàn)證,由客戶端的瀏覽器彈出一個(gè)身份驗(yàn)證窗口,提示用戶輸入用戶名和密碼,輸入完成后,連接數(shù)據(jù)庫(kù),查詢?cè)撚糜脩裘懊艽a是否正確,如果正確,允許登錄進(jìn)行相關(guān)操作,如果不正確,繼續(xù)要求用戶輸入用戶名和密碼。

函數(shù)說(shuō)明:

1、isset():用于確定某個(gè)變量是否已被賦值。根據(jù)變量值是否存在,返回true或false

2、header():用于發(fā)送特定的HTTP標(biāo)頭。注意,使用header()函數(shù)時(shí),一定要在任何產(chǎn)生實(shí)際輸出的HTML或PHP代碼前面調(diào)用該函數(shù)。

3、mysql_connect():打開 MySQL 服務(wù)器連接。

4、mysql_db_query():送查詢字符串 (query) 到 MySQL 數(shù)據(jù)庫(kù)。

5、mysql_fetch_row():返回單列的各字段。

二、用Session實(shí)現(xiàn)服務(wù)器驗(yàn)證

對(duì)于需要身份驗(yàn)證的頁(yè)面,使用Apache服務(wù)器驗(yàn)證是最好不過(guò)的了。但是,Apache服務(wù)器驗(yàn)證的界面不夠友好。而且,CGI模式的PHP,IIS下的PHP,都不能使用Apache服務(wù)器驗(yàn)證。這樣,我們可以利用Session在不同頁(yè)面間保存用戶身份,達(dá)到身份驗(yàn)證的目的。

在后端我們同樣利用上面的MySQL數(shù)據(jù)庫(kù)存放用戶信息。

我們先編寫一個(gè)用戶登錄界面,文件名為login.php,代碼如下:

以下為引用的內(nèi)容:

﹤form action="login1.php"﹥

用戶名:﹤input type="text" name="name"﹥﹤br﹥

口 令:﹤input type="text" name="pass"﹥﹤br﹥

﹤input type="submit" value="登錄"﹥

﹤/form﹥
?
login1.php處理提交的表單,代碼如下:

﹤?PHP

$db=mysql_connect("localhost","root","");

mysql_select_db("XinXiKu",$db);

$result=mysql_query("SELECT * FROM user where name='$name' and password='$pass'",$db);

if ($myrow = mysql_fetch_row($result)) {

//注冊(cè)用戶

session_start();

session_register("user");

$user=$myrow["user"];

// 身份驗(yàn)證成功,進(jìn)行相關(guān)操作

...

} else {

echo"身份驗(yàn)證失敗,您無(wú)權(quán)共享網(wǎng)絡(luò)資源!";

}

?﹥

這里需要說(shuō)明的是,用戶可以使用在后續(xù)的操作中用**http://domainname/next.php?user=用戶名 **來(lái)繞過(guò)身份驗(yàn)證。所以,后續(xù)的操作應(yīng)先檢查變量是否注冊(cè):已注冊(cè),則進(jìn)行相應(yīng)操作,否則視為非法登錄。相關(guān)代碼如下:

﹤?PHP

session_start();

if (!session_is_registered("user")){

echo "身份驗(yàn)證失敗,屬于非法登錄!";

} else {

//成功登錄進(jìn)行相關(guān)操作
...

}

?﹥

附錄:PHP以模塊方式安裝方法

1、首先下載文件:mod_php4-4.0.1-pl2。[如果你的不是PHP4,那么就趕快升級(jí)吧!]

解開后有三個(gè)文

關(guān)鍵詞標(biāo)簽:PHP

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門文章 plsql developer怎么連接數(shù)據(jù)庫(kù)-plsql developer連接數(shù)據(jù)庫(kù)方法 plsql developer怎么連接數(shù)據(jù)庫(kù)-plsql developer連接數(shù)據(jù)庫(kù)方法 2021年最好用的10款php開發(fā)工具推薦 2021年最好用的10款php開發(fā)工具推薦 php利用淘寶IP庫(kù)獲取用戶ip地理位置 php利用淘寶IP庫(kù)獲取用戶ip地理位置 在 PHP 中使用命令行工具 在 PHP 中使用命令行工具

相關(guān)下載

    人氣排行 詳解ucenter原理及第三方應(yīng)用程序整合思路、方法 plsql developer怎么連接數(shù)據(jù)庫(kù)-plsql developer連接數(shù)據(jù)庫(kù)方法 PHP中防止SQL注入攻擊 PHP會(huì)話Session的具體使用方法解析 PHP運(yùn)行出現(xiàn)Notice : Use of undefined constant 的解決辦法 PHP如何清空mySQL數(shù)據(jù)庫(kù) CakePHP程序員必須知道的21條技巧 PHP采集圖片實(shí)例(PHP采集)