2011-11-01 215 views
0

我有一個簡單的登錄頁面,用於檢查數據庫憑據,然後每個頁面都包含auth.php,驗證$_SESSION['logged']已設置,並且該會話未過期。php身份驗證最佳實踐...?

問題是,每個頁面還包含另一個頁面tab.php(類似於菜單),我也需要限制訪問,但包括auth.php在內的tab.php使得包含發生兩次。如果我不包含auth.phptab.php,任何人都可以直接跳過tab.php繞過驗證檢查,並可能檢索隱私信息。

要解決這種情況的最佳實踐?

編輯:

我忘了問,但你用什麼路徑,使其相對於站點根目錄?由於兩個auth.phptab.php是在文件夾和index.php包括tab.php是根 - include函數根據我用什麼路徑('./includes/auth.php' OR './auth.php')給出了一個錯誤或者index.phptab.php - 如果你知道我的意思。我試過'/includes/auth.php',但那不起作用。

+0

你是什麼意思「任何人都可以訪問標籤。 PHP的「?你是說如果他們知道文件的路徑,他們可以通過手動輸入來查看它? – Gazillion

+0

所以你想確定,必須包含auth.php,但你不想包含兩次? – dwalldorf

+0

難道你不需要:'include_once()'? – PeeHaa

回答

0

include_oncerequire_once一定會確保您沒有多次包含相同的文件(同時請確保您已通過身份驗證)。

然而,我會做的是將你的包括添加到「包含」文件夾,並禁止訪問 - 手動輸入路徑的人 - 通過htaccess文件。這樣你就可以將你的包含在一個地方(無論你的頭文件包含什麼樣的內容),並且保持你的包含文件清潔且仍然無法使用。如果你這樣做,你只需要做一些上面提到的答案,並檢查你的$_SESSION['logged']是否已設置(以及任何其他你需要的檢查)

+0

這對我來說似乎是一個完美的想法(因爲我已經將我的包含文件放在一個單獨的文件夾中),但這個概念對我來說是新的。當您完全限制對該文件夾的訪問時,是否還需要包含'$ _SESSION ['logged']'檢查包含文件('tab.php'和其他文件)? – Dwelle

+0

那麼我真的不知道你的網站是如何工作的。在這種情況下,我想你不會真的需要它,但我通常有不同的菜單,具體取決於用戶類型(管理員,版主,香草用戶)。因此,在這種情況下,不是檢查它們是否真正通過身份驗證,而是檢查哪種用戶並顯示正確的選項卡。 – Gazillion

+0

我的觀點是限制對'tab.php'文件的訪問,這個文件本身不會在瀏覽器中單獨加載(它甚至不包含樣式,只包含文本) - 以防某些人手動輸入文件路徑。我剛剛意識到,通過檢查'$ _SESSION',你還必須在'tab.php'內初始化'session_start();',如果你以後在index.php中包含這個頁面,會話初始化,如果我得到它的權利。 – Dwelle

1

在您的文件(或require_oncerequire)中使用include_once而不是include。這將確保您的auth.php文件只在腳本的生命週期中包含一次。

+0

是的,你是對的。我想確定我實際上在做什麼被認爲是最佳實踐,或者如果你關注我,還有其他方法可以限制訪問包含在其他文件中的文件。 – Dwelle

+0

不過,您正在調用認證方法兩次,當您在認證成功時向會話寫入時,這不是必需的。在tab.php中檢查正確的會話值並在出現錯誤(如果不可用)時就足夠了。 –

+0

是的,我知道。但是,這在單獨的文件中打破了這項檢查的全部重點。例如,如果我要更改會話時間限制,我必須在'auth.php'和'tab.php'(以及其他包含的文件 - auth.php'由以下內容組成: '$ _SESSION' check and'$ _ SESSION' time limit – Dwelle

0

只要在tab.php中檢查會話是否已初始化並且$ _SESSION ['logged']爲true。如果首先加載auth.php,這將工作正常。

+0

否則會返回一個錯誤或警告並填寫你的日誌和不必要的消息 – dwalldorf

+0

它不會。只是代碼聰明:'if(!isset($ _ SESSION ['logged']] )||!$ _ SESSION ['logged']){die('Access not granted');}' –

+0

無論如何,這是一個不穩定的解決方案,因爲他必須將此代碼添加到以後可能使用的任何文件中。如果他改變會話命名空間,他必須適應他使用你的解決方案的每個文件。require_once更好,我猜 – dwalldorf

0

如何使用require_once("auth.php");?這可以確保包含auth.php(否則應用程序將停止),但只包含文件一次這似乎是您的目標。

相關問題