2010-10-18 90 views
1

我在設計一種跨多個頁面使用Cookie維護會話的方法時遇到問題。我正在做一些非常類似於這個tutorial。我從啓動頁面檢查密碼和用戶名,如果它是正確的,那麼我設置一個cookie並用散列填充它。之後,我將用戶轉到其他頁面。如果用戶名/密碼不正確,那麼它只是重新導向回頁面。在多個頁面上維護會話

我無法弄清楚的主要問題是如何檢查cookie在多個頁面上的有效性。正如本教程所示,我正在使用PHP進行此操作。我認爲將散列發佈到新頁面是不正確的,但我想不出任何其他方式在加載頁面之前檢查會話/用戶的有效性。

在此先感謝。

+3

堅持'$ _SESSION',沒有理由直接與cookie進行交互。 – meagar 2010-10-18 21:13:11

回答

10

該教程教會你以非常不安全的方式做事。將這種認證數據存儲在cookie中是非常糟糕的,特別是使用諸如「用戶名」和「密碼」這樣高度明顯的名稱。

更好的(也比「教程」教導的更安全)是使用常規的PHP會話。 PHP將負責爲你設置會話cookie,並且你所做的只是將你的認證數據存儲在會話中。任何時候都不會將這些數據發送給用戶,除非您自己做。會話cookie的唯一來源是會話cookie,它是一個隨機垃圾串,「唯一」標識用戶爲PHP。

一旦你得到了部分實現,那麼你把一個小片段,在你所有的登錄要求的頁面的頂部,看起來是這樣的:

<?php 

session_start() 
if ($_SESSION['loggedin'] !== TRUE) { 
    header("Location: http://example.com/login.php"); 
    echo 'You must log in first'; 
    exit(); 
} 
?> 
<h1>Welcome back, <?php echo $_SESSION['username'] ?></h1> 

除非你在運行嚴重錯誤配置的PHP或PHP版本,在遠離石器時代的情況下,遠程用戶無法以某種方式設置「登錄」標誌,而無需先通過代碼。

+1

使用cookies沒有問題,只要你在儲存密碼之前先用salt加密即可。但是你是對的,教程很糟糕,沒有人應該在任何地方存儲明文密碼(包括數據庫)。 – Noodles 2010-10-18 21:31:06

+0

因此,在我驗證密碼和用戶名後,我開始一個會話並加載新頁面。在加載新頁面時,我檢查會話是否已登錄? – Aya 2010-10-18 21:32:43

+0

@aya:是的,這是基礎知識。無論登錄如何進行,您都可以開始會話並存儲登錄嘗試的次數(通過刪除cookie可以輕鬆繞過,但可以阻止更少的智能人員進入)。只有登錄成功,你才能存儲'已登錄'標誌。 – 2010-10-19 12:12:44