PHP加密文字檔並限制特定頁面的存取

來源:互聯網
上載者:User
加密|頁面 一、 簡介

  儘管在一般情況下,你的網站往往相當簡單以至它根本不要求使用資料庫;但是在有些情況下,你的網站可能想限制對某些頁面的存取。一般地,這意味著要使用一個資料庫來儲存口令和使用者名稱。然而,你還有一個更容易的方法-儘管其安全性差了一點,但是它僅包含了極少的編碼。

  如果你在自己的Web應用程式中使用了資料庫,那麼你已經能夠在某處儲存口令和使用者名稱,並且有一種方法可用來認證訪問者。但是,當因你的網站的安全性或複雜性需要而無法保證使用資料庫時,那該怎麼辦?可能有些時候你僅想要一些特別的人存取你的網站的某些頁面或一些地區。為此,一種很簡單的方式就是使用一個儲存口令的文字檔,並且建立一個頁面來提示訪問者輸入口令;如果口令與儲存在該文字檔中的內容相匹配,那麼允許該使用者存取受限的頁面;否則,在開始重新整理頁面之前顯示一條適當的訊息以禁止其存取。

  為了進一步的安全起見,你還可以用雜湊法來加密儲存在文字檔中的口令,這樣如果它的內容在某種程度上被發現,它還將會是很難被查明。所有這些都可以用PHP方法來構建,而且只需極少量的編碼。

  在正式開始前,你需要建立一個環境來測試和使用PHP;所以,你首先需要為PHP安裝和配置一個Web伺服器。由於Apache與PHP協同工作良好,並且易於安裝和配置,因此我推薦使用這一方案。

  接下來,你需要建立一個頁面(類似下圖)-它有一個文字框用於接收來自訪問者的口令,還有一個submit按鈕來把它發送到你的PHP檔案。這既可以是一個新頁面也可以是你的網站上的一個現有頁面的一部分。象下面簡單的代碼塊應該足夠了:

<form name="passwordForm" method="post" action="restricted.php">
<p>Password:
<input type="password" name="password">
<input type="submit" name="Submit" value="Login">
</p>
</form>

   二、 建立PHP首頁

  接下來,你需要建立完成實際工作的PHP首頁。在一個文字編輯器中開啟一個空白頁面,然後以標準方式開啟一個PHP塊:

<?
  如我以前所提及的,PHP具有一套標準的函數和方法用來實現檔案操作。其中,最為主要的幾個是fopen(),fread()和fclose()函數。為了進行某種檔案操作,我們需要先開啟它,並且很明顯,這是使用fopen()函數實現的;而且,我們必須指定如何操作檔案;讀檔案,讀檔案是最普通的任務,但是另外一些額外標誌可以用來告訴程式是把檔案指標放在開始還是檔案的結束,以及如果檔案還不存在的話是否建立該檔案。然而,在本例中,我們所需要做的是,開啟包含口令字的文字檔並讀取它。

  然後,首先建立一個到指定文字檔路徑的變數:

$fileloc = "/apachesite/docs/pass.txt"

  接下來,建立一個變數來存放檔案指標:

$filetoread = fopen($fileloc, "r") or die("Could not open password file");

  你也可以使用die方法來結束該指令碼,並且如果操作因某種原因失敗的話將在螢幕上列印一條適當的訊息。一旦開啟檔案,你需要讀取它的內容,以便把它與以口令字形式輸入的內容進行比較:

$storedpass = fread($filetoread, filesize($fileloc)) or die ("Could not read stored password");

  你應該設定一個變數來存放檔案中的資料,並且調用fread()方法(它有兩個參數:檔案指標和檔案長度)。你可能知道(也可能不知道)你的口令的長度。為了使將來的編程容易些(當口令字需要改變時),你可以使用filesize()方法來得到檔案長度。一旦檔案不再需要,立即關閉之:

  fclose($filetoread);
   三、 使用口令

  為了使用輸入到HTML表單中的口令,你需要得到它並把它儲存到一個變數中。當我們使用POST方法來把使用者輸入的內容發送到PHP指令碼時,我們可以使用$_POST來取得輸入的口令:

$password = $_POST["password"];
  然後,我們可以簡單地把輸入的口令字與儲存的口令字進行比較並採取相應的措施:

if (empty ($password)){
die ("No password entered");
}
elseif ($password != $storedpass){
die ("Password Incorrect");
}
else{
Header("Location: securepage.htm")
}
?>
  第一個if語句處理一個空的$password變數以防止當輸入框為空白時,submit按鈕被點擊。如果使用者輸入的口令與儲存的那個不匹配,那麼第二個語句執行括弧內的代碼並且輸出一條訊息顯示口令是錯誤的。最後,如果前兩個條件都不滿足,那麼,該指令碼認為口令一定是正確的並且把一個重新導向頭(header)發送到瀏覽器以開啟樣本中的HTML頁面。

  在此能夠工作之前,你需要建立一個文字檔並且把它放到與該PHP檔案相同的目錄下。它需要包含你目前想要使用的以普通文本形式儲存的口令,並且應該引用該PHP檔案名稱。儲存所有這些檔案,然後在一個瀏覽器中開啟該HTML頁面,並用該表單進行實驗。該頁面應該如所設想的那樣工作。

  當你輸入正確的口令時,如果你得到一個錯誤訊息,其內容是:

"Warning: Cannot modify header information - headers already sent by (thepathtoyourphpfile)"
  這意味著,你需要把位於你的Windows目錄下的php.ini檔案中的output-buffering設定為"on"。


   四、 加密

  現在,我們開始分析在前面提到的加密問題。PHP具有一些內建的MD5方法。這樣以來,在把訪問者輸入的口令與儲存的口令進行比較之前,我們可以很容易地使用這些函數來轉換它。

  MD5是一種單向雜湊演算法,這意味著口令可以僅用一種方向進行加密-從普通文本到加密文本,而以另外一種方向是不可能的。然而,這並不是就能使得它不可破解。這種加密容易被以暴力方式或者通過字典攻擊加以破解,但是它仍然還是比較安全的。你可以把下列一行添加到$password變數的聲明語句之後:

$md5password = (md5($password));
  這樣可以把一個輸入到該文字框中的內容的加密版本儲存到變數$md5password中。現在,你需要修改你的if語句,以便它把儲存的口令與新的加密的口令加以比較:

if (empty ($password))
{
 die ("No password entered");
}
elseif ($md5password != $storedpass)
{
 die ("Password Incorrect");
}
else
{
 header("Location: securepage.htm");
}
  如你所見,我們僅改變了語句的elseif部分中的變數。這是因為即使是一個空的輸入變數也被雜湊化為一個32位值,因此$md5variable永遠不可能為空白,-即使在把任何文本輸入到輸入欄位之前點擊submit按鈕。

  現在,所有你需要做的就是,找到你想儲存在文字檔pass.txt中的該口令的雜湊值。為此,你可以注釋掉整個的if語句並且再加上一個echo語句以把加密的口令顯示在螢幕上。然後,你還可以複製加密串並且把它儲存到口令檔案中。然而,你必須記住,在使用該指令碼之前,取消注釋if語句並且刪除echo調用。


  就本文所討論的方法而言,上面的指令碼架構所提供的已經足夠了。另外,本文所討論的測試檔案,儘管非常基本,但是該HTML頁面能夠被容易地加入到一個現有的頁面中去;你可以把它粘貼到一個視窗中去並整理它的樣式以匹配你的首頁的其餘部分,並且你可能包含一個定時函數-它在把訪問者重新定向到一個安全的頁面前等待一段固定的時間,同時顯示一條訊息指示口令正確。你還可以包含一個類似的函數集來重載初始頁面。

  總之,你可以使用本文所提供的指令碼來限制到你的網站結構中的特定頁面的存取。儘管該方法並沒有提供一個資料庫所提供的安全的使用者名稱/口令認證方法,並且它意味著你必須把口令發給想存取安全頁面的任何人,但是它的確耗費非常少的時間和編碼提供了一種簡單的安全層。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.