


PHP加密文本文件并限制特定頁面的存取
添加時(shí)間:2014-8-7 16:47:18
添加:
思海網(wǎng)絡(luò)
盡管在一般情況下,你的網(wǎng)站往往相當(dāng)簡單以至它根本不要求使用數(shù)據(jù)庫;但是在有些情況下,你的站點(diǎn)可能想限制對(duì)某些頁面的存取。一般地,這意味著要使用一個(gè)數(shù)據(jù)庫來存儲(chǔ)口令和用戶名。然而,你還有一個(gè)更容易的方法-盡管其安全性差了一點(diǎn),但是它僅包含了極少的編碼。
如果你在自己的Web應(yīng)用程序中使用了數(shù)據(jù)庫,那么你已經(jīng)能夠在某處存儲(chǔ)口令和用戶名,并且有一種方法可用來認(rèn)證訪問者。但是,當(dāng)因你的站點(diǎn)的安全性或復(fù)雜性需要而無法保證使用數(shù)據(jù)庫時(shí),那該怎么辦?可能有些時(shí)候你僅想要一些特別的人存取你的站點(diǎn)的某些頁面或一些區(qū)域。為此,一種很簡單的方式就是使用一個(gè)存儲(chǔ)口令的文本文件,并且創(chuàng)建一個(gè)頁面來提示訪問者輸入口令;如果口令與存儲(chǔ)在該文本文件中的內(nèi)容相匹配,那么允許該用戶存取受限的頁面;否則,在開始刷新頁面之前顯示一條適當(dāng)?shù)南⒁越蛊浯嫒 ?nbsp;
為了進(jìn)一步的安全起見,你還可以用哈希法來加密存儲(chǔ)在文本文件中的口令,這樣如果它的內(nèi)容在某種程度上被發(fā)現(xiàn),它還將會(huì)是很難被查明。所有這些都可以用PHP方法來構(gòu)建,而且只需極少量的編碼。
在正式開始前,你需要建立一個(gè)環(huán)境來測(cè)試和使用PHP;所以,你首先需要為PHP安裝和配置一個(gè)Web服務(wù)器。由于Apache與PHP協(xié)同工作良好,并且易于安裝和配置,因此我推薦使用這一方案。
接下來,你需要?jiǎng)?chuàng)建一個(gè)頁面(類似下圖)-它有一個(gè)文本框用于接收來自訪問者的口令,還有一個(gè)submit按鈕來把它發(fā)送到你的PHP文件。這既可以是一個(gè)新頁面也可以是你的網(wǎng)站上的一個(gè)現(xiàn)有頁面的一部分。象下面簡單的代碼塊應(yīng)該足夠了:
<form name="passwordForm" method="post" action="restricted.php">
<p>Password:
<input type="password" name="password">
<input type="submit" name="Submit" value="Login">
</p>
</form>
二、 創(chuàng)建PHP主頁
接下來,你需要?jiǎng)?chuàng)建完成實(shí)際工作的PHP主頁。在一個(gè)文本編輯器中打開一個(gè)空白頁面,然后以標(biāo)準(zhǔn)方式打開一個(gè)PHP塊:
<?
如我以前所提及的,PHP具有一套標(biāo)準(zhǔn)的函數(shù)和方法用來實(shí)現(xiàn)文件操作。其中,最為主要的幾個(gè)是fopen(),fread()和fclose()函數(shù)。為了進(jìn)行某種文件操作,我們需要先打開它,并且很明顯,這是使用fopen()函數(shù)實(shí)現(xiàn)的;而且,我們必須指定如何操作文件;讀文件,讀文件是最普通的任務(wù),但是另外一些額外標(biāo)志可以用來告訴程序是把文件指針放在開始還是文件的結(jié)束,以及如果文件還不存在的話是否創(chuàng)建該文件。然而,在本例中,我們所需要做的是,打開包含口令字的文本文件并讀取它。
然后,首先創(chuàng)建一個(gè)到指定文本文件路徑的變量:
$fileloc = "/apachesite/docs/pass.txt"
接下來,創(chuàng)建一個(gè)變量來存放文件指針:
$filetoread = fopen($fileloc, "r") or die("Could not open password file");
你也可以使用die方法來結(jié)束該腳本,并且如果操作因某種原因失敗的話將在屏幕上打印一條適當(dāng)?shù)南ⅰR坏┐蜷_文件,你需要讀取它的內(nèi)容,以便把它與以口令字形式輸入的內(nèi)容進(jìn)行比較:
$storedpass = fread($filetoread, filesize($fileloc)) or die ("Could not read stored password");
你應(yīng)該設(shè)置一個(gè)變量來存放文件中的數(shù)據(jù),并且調(diào)用fread()方法(它有兩個(gè)參數(shù):文件指針和文件長度)。你可能知道(也可能不知道)你的口令的長度。為了使將來的編程容易些(當(dāng)口令字需要改變時(shí)),你可以使用filesize()方法來得到文件長度。一旦文件不再需要,立即關(guān)閉之:
fclose($filetoread);
三、 使用口令
為了使用輸入到HTML表單中的口令,你需要得到它并把它存儲(chǔ)到一個(gè)變量中。當(dāng)我們使用POST方法來把用戶輸入的內(nèi)容發(fā)送到PHP腳本時(shí),我們可以使用$_POST來取得輸入的口令:
$password = $_POST["password"];
然后,我們可以簡單地把輸入的口令字與存儲(chǔ)的口令字進(jìn)行比較并采取相應(yīng)的措施:
if (empty ($password)){
die ("No password entered");
}
elseif ($password != $storedpass){
die ("Password Incorrect");
}
else{
Header("Location: securepage.htm")
}
?>
第一個(gè)if語句處理一個(gè)空的$password變量以防止當(dāng)輸入框?yàn)榭諘r(shí),submit按鈕被點(diǎn)擊。如果用戶輸入的口令與存儲(chǔ)的那個(gè)不匹配,那么第二個(gè)語句執(zhí)行括號(hào)內(nèi)的代碼并且輸出一條消息顯示口令是錯(cuò)誤的。最后,如果前兩個(gè)條件都不滿足,那么,該腳本認(rèn)為口令一定是正確的并且把一個(gè)重定向頭(header)發(fā)送到瀏覽器以打開示例中的HTML頁面。
在此能夠工作之前,你需要?jiǎng)?chuàng)建一個(gè)文本文件并且把它放到與該P(yáng)HP文件相同的目錄下。它需要包含你目前想要使用的以普通文本形式存儲(chǔ)的口令,并且應(yīng)該引用該P(yáng)HP文件名。保存所有這些文件,然后在一個(gè)瀏覽器中打開該HTML頁面,并用該表單進(jìn)行試驗(yàn)。該頁面應(yīng)該如所設(shè)想的那樣工作。
當(dāng)你輸入正確的口令時(shí),如果你得到一個(gè)錯(cuò)誤消息,其內(nèi)容是:
"Warning: Cannot modify header information - headers already sent by (thepathtoyourphpfile)"
這意味著,你需要把位于你的Windows目錄下的php.ini文件中的output-buffering設(shè)置為"on"。
四、 加密
現(xiàn)在,我們開始分析在前面提到的加密問題。PHP具有一些內(nèi)置的MD5方法。這樣以來,在把訪問者輸入的口令與存儲(chǔ)的口令進(jìn)行比較之前,我們可以很容易地使用這些函數(shù)來轉(zhuǎn)換它。
MD5是一種單向哈希算法,這意味著口令可以僅用一種方向進(jìn)行加密-從普通文本到加密文本,而以另外一種方向是不可能的。然而,這并不是就能使得它不可破解。這種加密容易被以暴力方式或者通過字典攻擊加以破解,但是它仍然還是比較安全的。你可以把下列一行添加到$password變量的聲明語句之后:
$md5password = (md5($password));
這樣可以把一個(gè)輸入到該文本框中的內(nèi)容的加密版本保存到變量$md5password中。現(xiàn)在,你需要修改你的if語句,以便它把存儲(chǔ)的口令與新的加密的口令加以比較:
if (empty ($password))
{
die ("No password entered");
}
elseif ($md5password != $storedpass)
{
die ("Password Incorrect");
}
else
{
header("Location: securepage.htm");
}
如你所見,我們僅改變了語句的elseif部分中的變量。這是因?yàn)榧词故且粋(gè)空的輸入變量也被哈希化為一個(gè)32位值,因此$md5variable永遠(yuǎn)不可能為空,-即使在把任何文本輸入到輸入域之前點(diǎn)擊submit按鈕。
現(xiàn)在,所有你需要做的就是,找到你想存儲(chǔ)在文本文件pass.txt中的該口令的哈希值。為此,你可以注釋掉整個(gè)的if語句并且再加上一個(gè)echo語句以把加密的口令顯示在屏幕上。然后,你還可以復(fù)制加密串并且把它保存到口令文件中。然而,你必須記住,在使用該腳本之前,取消注釋if語句并且刪除echo調(diào)用。
就本文所討論的方法而言,上面的腳本框架所提供的已經(jīng)足夠了。另外,本文所討論的測(cè)試文件,盡管非常基本,但是該HTML頁面能夠被容易地加入到一個(gè)現(xiàn)有的頁面中去;你可以把它粘貼到一個(gè)窗口中去并整理它的樣式以匹配你的主頁的其余部分,并且你可能包含一個(gè)定時(shí)函數(shù)-它在把訪問者重新定向到一個(gè)安全的頁面前等待一段固定的時(shí)間,同時(shí)顯示一條消息指示口令正確。你還可以包含一個(gè)類似的函數(shù)集來重載初始頁面。
如果你在自己的Web應(yīng)用程序中使用了數(shù)據(jù)庫,那么你已經(jīng)能夠在某處存儲(chǔ)口令和用戶名,并且有一種方法可用來認(rèn)證訪問者。但是,當(dāng)因你的站點(diǎn)的安全性或復(fù)雜性需要而無法保證使用數(shù)據(jù)庫時(shí),那該怎么辦?可能有些時(shí)候你僅想要一些特別的人存取你的站點(diǎn)的某些頁面或一些區(qū)域。為此,一種很簡單的方式就是使用一個(gè)存儲(chǔ)口令的文本文件,并且創(chuàng)建一個(gè)頁面來提示訪問者輸入口令;如果口令與存儲(chǔ)在該文本文件中的內(nèi)容相匹配,那么允許該用戶存取受限的頁面;否則,在開始刷新頁面之前顯示一條適當(dāng)?shù)南⒁越蛊浯嫒 ?nbsp;
為了進(jìn)一步的安全起見,你還可以用哈希法來加密存儲(chǔ)在文本文件中的口令,這樣如果它的內(nèi)容在某種程度上被發(fā)現(xiàn),它還將會(huì)是很難被查明。所有這些都可以用PHP方法來構(gòu)建,而且只需極少量的編碼。
在正式開始前,你需要建立一個(gè)環(huán)境來測(cè)試和使用PHP;所以,你首先需要為PHP安裝和配置一個(gè)Web服務(wù)器。由于Apache與PHP協(xié)同工作良好,并且易于安裝和配置,因此我推薦使用這一方案。
接下來,你需要?jiǎng)?chuàng)建一個(gè)頁面(類似下圖)-它有一個(gè)文本框用于接收來自訪問者的口令,還有一個(gè)submit按鈕來把它發(fā)送到你的PHP文件。這既可以是一個(gè)新頁面也可以是你的網(wǎng)站上的一個(gè)現(xiàn)有頁面的一部分。象下面簡單的代碼塊應(yīng)該足夠了:
<form name="passwordForm" method="post" action="restricted.php">
<p>Password:
<input type="password" name="password">
<input type="submit" name="Submit" value="Login">
</p>
</form>
二、 創(chuàng)建PHP主頁
接下來,你需要?jiǎng)?chuàng)建完成實(shí)際工作的PHP主頁。在一個(gè)文本編輯器中打開一個(gè)空白頁面,然后以標(biāo)準(zhǔn)方式打開一個(gè)PHP塊:
<?
如我以前所提及的,PHP具有一套標(biāo)準(zhǔn)的函數(shù)和方法用來實(shí)現(xiàn)文件操作。其中,最為主要的幾個(gè)是fopen(),fread()和fclose()函數(shù)。為了進(jìn)行某種文件操作,我們需要先打開它,并且很明顯,這是使用fopen()函數(shù)實(shí)現(xiàn)的;而且,我們必須指定如何操作文件;讀文件,讀文件是最普通的任務(wù),但是另外一些額外標(biāo)志可以用來告訴程序是把文件指針放在開始還是文件的結(jié)束,以及如果文件還不存在的話是否創(chuàng)建該文件。然而,在本例中,我們所需要做的是,打開包含口令字的文本文件并讀取它。
然后,首先創(chuàng)建一個(gè)到指定文本文件路徑的變量:
$fileloc = "/apachesite/docs/pass.txt"
接下來,創(chuàng)建一個(gè)變量來存放文件指針:
$filetoread = fopen($fileloc, "r") or die("Could not open password file");
你也可以使用die方法來結(jié)束該腳本,并且如果操作因某種原因失敗的話將在屏幕上打印一條適當(dāng)?shù)南ⅰR坏┐蜷_文件,你需要讀取它的內(nèi)容,以便把它與以口令字形式輸入的內(nèi)容進(jìn)行比較:
$storedpass = fread($filetoread, filesize($fileloc)) or die ("Could not read stored password");
你應(yīng)該設(shè)置一個(gè)變量來存放文件中的數(shù)據(jù),并且調(diào)用fread()方法(它有兩個(gè)參數(shù):文件指針和文件長度)。你可能知道(也可能不知道)你的口令的長度。為了使將來的編程容易些(當(dāng)口令字需要改變時(shí)),你可以使用filesize()方法來得到文件長度。一旦文件不再需要,立即關(guān)閉之:
fclose($filetoread);
三、 使用口令
為了使用輸入到HTML表單中的口令,你需要得到它并把它存儲(chǔ)到一個(gè)變量中。當(dāng)我們使用POST方法來把用戶輸入的內(nèi)容發(fā)送到PHP腳本時(shí),我們可以使用$_POST來取得輸入的口令:
$password = $_POST["password"];
然后,我們可以簡單地把輸入的口令字與存儲(chǔ)的口令字進(jìn)行比較并采取相應(yīng)的措施:
if (empty ($password)){
die ("No password entered");
}
elseif ($password != $storedpass){
die ("Password Incorrect");
}
else{
Header("Location: securepage.htm")
}
?>
第一個(gè)if語句處理一個(gè)空的$password變量以防止當(dāng)輸入框?yàn)榭諘r(shí),submit按鈕被點(diǎn)擊。如果用戶輸入的口令與存儲(chǔ)的那個(gè)不匹配,那么第二個(gè)語句執(zhí)行括號(hào)內(nèi)的代碼并且輸出一條消息顯示口令是錯(cuò)誤的。最后,如果前兩個(gè)條件都不滿足,那么,該腳本認(rèn)為口令一定是正確的并且把一個(gè)重定向頭(header)發(fā)送到瀏覽器以打開示例中的HTML頁面。
在此能夠工作之前,你需要?jiǎng)?chuàng)建一個(gè)文本文件并且把它放到與該P(yáng)HP文件相同的目錄下。它需要包含你目前想要使用的以普通文本形式存儲(chǔ)的口令,并且應(yīng)該引用該P(yáng)HP文件名。保存所有這些文件,然后在一個(gè)瀏覽器中打開該HTML頁面,并用該表單進(jìn)行試驗(yàn)。該頁面應(yīng)該如所設(shè)想的那樣工作。
當(dāng)你輸入正確的口令時(shí),如果你得到一個(gè)錯(cuò)誤消息,其內(nèi)容是:
"Warning: Cannot modify header information - headers already sent by (thepathtoyourphpfile)"
這意味著,你需要把位于你的Windows目錄下的php.ini文件中的output-buffering設(shè)置為"on"。
四、 加密
現(xiàn)在,我們開始分析在前面提到的加密問題。PHP具有一些內(nèi)置的MD5方法。這樣以來,在把訪問者輸入的口令與存儲(chǔ)的口令進(jìn)行比較之前,我們可以很容易地使用這些函數(shù)來轉(zhuǎn)換它。
MD5是一種單向哈希算法,這意味著口令可以僅用一種方向進(jìn)行加密-從普通文本到加密文本,而以另外一種方向是不可能的。然而,這并不是就能使得它不可破解。這種加密容易被以暴力方式或者通過字典攻擊加以破解,但是它仍然還是比較安全的。你可以把下列一行添加到$password變量的聲明語句之后:
$md5password = (md5($password));
這樣可以把一個(gè)輸入到該文本框中的內(nèi)容的加密版本保存到變量$md5password中。現(xiàn)在,你需要修改你的if語句,以便它把存儲(chǔ)的口令與新的加密的口令加以比較:
if (empty ($password))
{
die ("No password entered");
}
elseif ($md5password != $storedpass)
{
die ("Password Incorrect");
}
else
{
header("Location: securepage.htm");
}
如你所見,我們僅改變了語句的elseif部分中的變量。這是因?yàn)榧词故且粋(gè)空的輸入變量也被哈希化為一個(gè)32位值,因此$md5variable永遠(yuǎn)不可能為空,-即使在把任何文本輸入到輸入域之前點(diǎn)擊submit按鈕。
現(xiàn)在,所有你需要做的就是,找到你想存儲(chǔ)在文本文件pass.txt中的該口令的哈希值。為此,你可以注釋掉整個(gè)的if語句并且再加上一個(gè)echo語句以把加密的口令顯示在屏幕上。然后,你還可以復(fù)制加密串并且把它保存到口令文件中。然而,你必須記住,在使用該腳本之前,取消注釋if語句并且刪除echo調(diào)用。
就本文所討論的方法而言,上面的腳本框架所提供的已經(jīng)足夠了。另外,本文所討論的測(cè)試文件,盡管非常基本,但是該HTML頁面能夠被容易地加入到一個(gè)現(xiàn)有的頁面中去;你可以把它粘貼到一個(gè)窗口中去并整理它的樣式以匹配你的主頁的其余部分,并且你可能包含一個(gè)定時(shí)函數(shù)-它在把訪問者重新定向到一個(gè)安全的頁面前等待一段固定的時(shí)間,同時(shí)顯示一條消息指示口令正確。你還可以包含一個(gè)類似的函數(shù)集來重載初始頁面。
總之,你可以使用本文所提供的腳本來限制到你的站點(diǎn)結(jié)構(gòu)中的特定頁面的存取。盡管該方法并沒有提供一個(gè)數(shù)據(jù)庫所提供的安全的用戶名/口令認(rèn)證方法,并且它意味著你必須把口令發(fā)給想存取安全頁面的任何人,但是它的確耗費(fèi)非常少的時(shí)間和編碼提供了一種簡單的安全層。
關(guān)鍵字:PHP、加密、數(shù)據(jù)庫、服務(wù)器
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解