PHP教程.應(yīng)用實(shí)例12
Jun 21, 2016 am 09:14 AM教程|應(yīng)用實(shí)例
PHP中用戶身份認(rèn)證實(shí)現(xiàn)二法(1)
用戶在設(shè)計(jì)和維護(hù)站點(diǎn)的時(shí)候,經(jīng)常需要限制對某些重要文件或信息的訪問。通常,我們可以采用內(nèi)置于WEB服務(wù)器的基于HTTP協(xié)議的用戶身份驗(yàn)證機(jī)制。當(dāng)訪問者瀏覽受保護(hù)頁面時(shí),客戶端瀏覽器會彈出對話窗口要求用戶輸入用戶名和密碼,對用戶的身份進(jìn)行驗(yàn)證,以決定用戶是否有權(quán)訪問頁面。下面用兩種方法來說明其實(shí)現(xiàn)原理。
一、用HTTP標(biāo)頭來實(shí)現(xiàn)
標(biāo)頭是服務(wù)器以HTTP協(xié)議傳送HTML信息到瀏覽器前所送出的字串。HTTP采用一種挑戰(zhàn)/響應(yīng)模式對試圖進(jìn)入受密碼保護(hù)區(qū)域的用戶進(jìn)行身份驗(yàn)證。具體來說,當(dāng)用戶首次向WEB服務(wù)器發(fā)出訪問受保護(hù)區(qū)域的請求時(shí),挑戰(zhàn)進(jìn)程被啟動(dòng),服務(wù)器返回特殊的401標(biāo)頭,表明該用戶身份未經(jīng)驗(yàn)證??蛻舳藶g覽器在檢測到上述響應(yīng)之后自動(dòng)彈出對話框,要求用戶輸入用戶名和密碼。用戶完成輸入之后點(diǎn)擊確定,其身份識別信息就被傳送到服務(wù)端進(jìn)行驗(yàn)證。如果用戶輸入的用戶名和密碼有效,WEB服務(wù)器將允許用戶進(jìn)入受保護(hù)區(qū)域,并且在整個(gè)訪問過程中保持其身份的有效性。相反,若用戶輸入的用戶名稱或密碼無法通過驗(yàn)證,客戶端瀏覽器會不斷彈出輸入窗口要求用戶再次嘗試輸入正確的信息。整個(gè)過程將一直持續(xù)到用戶輸入正確的信息位置,也可以設(shè)定允許用戶進(jìn)行嘗試的最大次數(shù),超出時(shí)將自動(dòng)拒絕用戶的訪問請求。
在PHP腳本中,使用函數(shù)header()直接給客戶端的瀏覽器發(fā)送HTTP標(biāo)頭,這樣在客戶端將會自動(dòng)彈出用戶名和密碼輸入窗口,來實(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ù)庫中用戶帳號信息來驗(yàn)證用戶身份!
不過,需要提醒使用者注意的是:只有在以模塊方式安裝的PHP中才能使用$PHP_AUTH_USER,$PHP_AUTH_PW,以及 $PHP_AUTH_TYPE這三個(gè)變量。如果用戶使用的是CGI模式的PHP則無法實(shí)現(xiàn)驗(yàn)證功能。在本節(jié)后附有PHP的模塊方式安裝方法。
下面我們用Mysql數(shù)據(jù)庫來存儲用戶的身份。我們需要從數(shù)據(jù)庫中提取每個(gè)帳號的用戶名和密碼以便與$PHP_AUTH_USER和$PHP_AUTH_PW變量進(jìn)行比較,判斷用戶的真實(shí)性。
首先,在MySql中建立一個(gè)存放用戶信息的數(shù)據(jù)庫
數(shù)據(jù)庫名為XinXiKu ,表名為user;表定義如下:
create table user(
ID INT(4) NOT NULL AUTO_INCREMENT,
name VARCHAR(8) NOT NULL,
password CHAR(8) NOT NULL,
PRIMARY KEY(ID)
)
說明:
1、ID為一個(gè)序列號,不為零而且自動(dòng)遞增,為主鍵;
2、name為用戶名,不能為空;
3、password為用戶密碼,不能為空;
以下是用戶驗(yàn)證文件login.php
//判斷用戶名是否設(shè)置
if(!isset($PHP_AUTH_USER))
{
header("WWW-Authenticate:Basic realm="身份驗(yàn)證功能"");
header("HTTP/1.0 401 Unauthorized");
echo "身份驗(yàn)證失敗,您無權(quán)共享網(wǎng)絡(luò)資源!";
exit();
}
/*連接數(shù)據(jù)庫*/
$db=mysql_connect("localhost","root","");
//選擇數(shù)據(jù)庫
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)證失敗,您無權(quán)共享網(wǎng)絡(luò)資源!";
exit();
}
?>
程序說明:
在程序中,首先檢查變量$PHP_AUTH_USER是否已經(jīng)設(shè)置。如果沒有設(shè)置,說明需要驗(yàn)證,腳本發(fā)出HTTP 401錯(cuò)誤號頭標(biāo),告訴客戶端的瀏覽器需要進(jìn)行身份驗(yàn)證,由客戶端的瀏覽器彈出一個(gè)身份驗(yàn)證窗口,提示用戶輸入用戶名和密碼,輸入完成后,連接數(shù)據(jù)庫,查詢該用用戶名及密碼是否正確,如果正確,允許登錄進(jìn)行相關(guān)操作,如果不正確,繼續(xù)要求用戶輸入用戶名和密碼。
函數(shù)說明:
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ù)庫。
5、mysql_fetch_row():返回單列的各字段。
二、用session實(shí)現(xiàn)服務(wù)器驗(yàn)證
對于需要身份驗(yàn)證的頁面,使用apache服務(wù)器驗(yàn)證是最好不過的了。但是,apache服務(wù)器驗(yàn)證的界面不夠友好。而且,cgi模式的php,iis下的php,都不能使用apache服務(wù)器驗(yàn)證。這樣,我們可以利用session在不同頁面間保存用戶身份,達(dá)到身份驗(yàn)證的目的。
在后端我們同樣利用上面的Mysql數(shù)據(jù)庫存放用戶信息。
我們先編寫一個(gè)用戶登錄界面,文件名為login.php,代碼職下:
____________________________________________________________
____________________________________________________________
login1.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))
{
//注冊用戶
session_start();
session_register("user");
$user=$myrow["user"];
// 身份驗(yàn)證成功,進(jìn)行相關(guān)操作
...
}
else
{
echo"身份驗(yàn)證失敗,您無權(quán)共享網(wǎng)絡(luò)資源!";
}
?>
這里需要說明的是,用戶可以使用在后續(xù)的操作中用**http://domainname/next.php?user=用戶名 **來繞過身份驗(yàn)證。所以,后續(xù)的操作應(yīng)先檢查變量是否注冊:已注冊,則進(jìn)行相應(yīng)操作,否則視為非法登錄。相關(guān)代碼如下:
session_start();
if (!session_is_registered("user"))
{
echo "身份驗(yàn)證失敗,屬于非法登錄!";
}
else
{
//成功登錄進(jìn)行相關(guān)操作
...
}
?>
附錄:PHP以模塊方式安裝方法
1、首先下載文件:mod_php4-4.0.1-pl2。[如果你的不是PHP4,那么就趕快升級吧!]
解開后有三個(gè)文件:mod_php4.dll、mod_php4.conf、readme.txt
2、相關(guān)文件拷貝
把mod_php4.dll拷貝到apache安裝目錄的modules目錄下面
把mod_php4.conf拷貝到apache安裝目錄的conf目錄下面
把msvcrt.dll文件拷貝到apache的安裝目錄下面
3、打開conf/srm.conf文件 ,在其中加上一句
Include conf/mod_php4.conf
在做這一些之前請把您的httpd.conf中關(guān)于CGI模式的所以設(shè)置語句都去掉,即類似下面的部分!
ScripAlias /php4/ "C:/php4/"
AddType application/x-httpd-php4 .php

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP設(shè)置的關(guān)鍵在於明確安裝方式、配置php.ini、連接Web服務(wù)器及啟用必要擴(kuò)展。 1.安裝PHP:Linux用apt、Mac用Homebrew、Windows推薦XAMPP;2.配置php.ini:調(diào)整錯(cuò)誤報(bào)告、上傳限制等並重啟服務(wù)器;3.搭配Web服務(wù)器:Apache通過mod_php,Nginx使用PHP-FPM;4.安裝常用擴(kuò)展:如mysqli、json、mbstring等以支持完整功能。

ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

易於效率,啟動(dòng)啟動(dòng)tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)

寫好PHP註釋的關(guān)鍵在於明確目的與規(guī)範(fàn),註釋應(yīng)解釋“為什麼”而非“做了什麼”,避免冗餘或過於簡單。 1.使用統(tǒng)一格式,如docblock(/*/)用於類、方法說明,提升可讀性與工具兼容性;2.強(qiáng)調(diào)邏輯背後的原因,如說明為何需手動(dòng)輸出JS跳轉(zhuǎn);3.在復(fù)雜代碼前添加總覽性說明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標(biāo)記待辦事項(xiàng)與問題,便於後續(xù)追蹤與協(xié)作。好的註釋能降低溝通成本,提升代碼維護(hù)效率。

PHP註釋代碼常用方法有三種:1.單行註釋用//或#屏蔽一行代碼,推薦使用//;2.多行註釋用/.../包裹代碼塊,不可嵌套但可跨行;3.組合技巧註釋如用/if(){}/控制邏輯塊,或配合編輯器快捷鍵提升效率,使用時(shí)需注意閉合符號和避免嵌套。

PHPblockcommentsareusefulforwritingmulti-lineexplanations,temporarilydisablingcode,andgeneratingdocumentation.Theyshouldnotbenestedorleftunclosed.BlockcommentshelpindocumentingfunctionswithPHPDoc,whichtoolslikePhpStormuseforauto-completionanderrorche

註釋不能馬虎是因?yàn)樗忉尨a存在的原因而非功能,例如兼容老接口或第三方限制,否則看代碼的人只能靠猜。必須加註釋的地方包括複雜的條件判斷、特殊的錯(cuò)誤處理邏輯、臨時(shí)繞過的限制。寫註釋更實(shí)用的方法是根據(jù)場景選擇單行註釋或塊註釋,函數(shù)、類、文件開頭用文檔塊註釋說明參數(shù)與返回值,並保持註釋更新,對複雜邏輯可在前面加一行概括整體意圖,同時(shí)不要用註釋封存代碼而應(yīng)使用版本控制工具。

寫好註釋的關(guān)鍵在於說明“為什麼”而非僅“做了什麼”,提升代碼可讀性。 1.註釋應(yīng)解釋邏輯原因,例如值選擇或處理方式背後的考量;2.對複雜邏輯使用段落式註釋,概括函數(shù)或算法的整體思路;3.定期維護(hù)註釋確保與代碼一致,避免誤導(dǎo),必要時(shí)刪除過時(shí)內(nèi)容;4.在審查代碼時(shí)同步檢查註釋,並通過文檔記錄公共邏輯以減少代碼註釋負(fù)擔(dān)。
