首頁  >  文章  >  後端開發  >  PHP實作加密文字檔案並限制特定頁面的存取的效果_php實例

PHP實作加密文字檔案並限制特定頁面的存取的效果_php實例

WBOY
WBOY原創
2016-12-05 13:28:141126瀏覽

檔案的加密程式在網站上已經應用的很廣泛了,這意味著要使用一個資料庫來儲存口令和使用者名稱。具體如下:

一、 簡介

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

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

為了進一步的安全起見,你也可以用哈希法來加密儲存在文字檔案中的口令,這樣如果它的內容在某種程度上被發現,它還會是很難被查明。所有這些都可以用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页面能够被容易地加入到一个现有的页面中去;你可以把它粘贴到一个窗口中去并整理它的样式以匹配你的主页的其余部分,并且你可能包含一个定时函数-它在把访问者重新定向到一个安全的页面前等待一段固定的时间,同时显示一条消息指示口令正确。你还可以包含一个类似的函数集来重载初始页面。

总之,你可以使用本文所提供的脚本来限制到你的站点结构中的特定页面的存取。尽管该方法并没有提供一个数据库所提供的安全的用户名/口令认证方法,并且它意味着你必须把口令发给想存取安全页面的任何人,但是它的确耗费非常少的时间和编码提供了一种简单的安全层。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn