2013-10-17 68 views
0

我有一個應用程序,登錄和註銷工作正常。一旦用戶註銷並嘗試訪問他需要驗證的頁面,他將被重定向到登錄屏幕。註銷後的Cookie重播php CodeIgniter

我的問題在於哪裏。如果我在登錄時如果複製cookie值並將它們保存在文件中。註銷後,我更改cookie並添加相同的值,然後以同一用戶的身份重新登錄到應用程序中。

在註銷時我寫了一個循環遍歷所有cookie並刪除它們的函數。

我的理解是cookie既在客戶端也在服務器端。所以,如果cookies被刪除了,它們就會被刪除,並且服務器在被清除後不會識別它們,即使瀏覽器再次發送它們(顯然情況並非如此,我想)。

我之所以這樣做是因爲這是我們的安全審計員提出的要點之一,我需要找到解決這個漏洞的方法。 (在這一點上,做https是不可行的)

如果有人能指示我如何清除服務器端的cookie,我會很高興,所以,當下次有人點擊服務器時使用相同的cookie,它不接受它作爲有效的cookie。

編輯:

我使用笨會議和tank_auth作爲認證庫。註銷時,庫本身調用

$this->ci->session->sess_destroy();

要格外肯定的是,我嘗試了一些嘗試後執行以下操作:

session_start(); 
session_unset(); 
session_destroy(); 
session_write_close(); 
setcookie(session_name(),'',0,'/'); 
session_regenerate_id(true); 

我的正常註銷的作品,如果我嘗試訪問直接頁面不會打開。

,如果當我登錄,我把我的餅乾,保存在某個地方吧 - 註銷成功,並與我的大更換的餅乾,我馬上回到會話中。

有沒有辦法阻止這種行爲 - 服務器端在它被銷燬之後不會招待會話的地方。我也確保我的服務器和php在同一時區(將其設置爲date_default_timezone_set)。

+0

聽起來像你應該使用會話不是餅乾 – 2013-10-17 19:37:05

+0

我現在用的是笨 - '$這個 - >會話級> set_userdata();' – codeHead

+0

對不起,什麼都不知道笨 – 2013-10-17 19:41:48

回答

2

根本不存儲在服務器上。這些存儲在瀏覽器中,然後在請求頭中發送到服務器。您可以輕鬆找到允許您創建/編輯/刪除Cookie的瀏覽器軟件和插件。出於這個原因,你絕對不應該在cookies中存儲敏感信息。基本上你想要做的是將用戶數據存儲在會話中,然後將會話名稱存儲在cookie中。通常這是在使用函數session_start()時在php中自動完成的。

如果您使用的是Codeigniter,則php會話函數將被封裝在每個頁面加載時自動加載的CI會話庫中。因此,而不是存儲在$ _COOKIE數據,你會希望得到/通過在會議庫中的用戶數據的方法設置你的數據:

//in your controller 
//save session data 
$userdata = array(
    "isLoggedIn"=>true, 
    "username"=>$_POST['username'] 
); 
$this->session->set_userdata($userdata); 

//get session data later 
$isLoggedIn = $this->session->userdata("isLoggedIn"); 
if(!$isLoggedIn){ 
    //if the user is not logged in, destroy the session and send to the login screen 
    $this->session->sess_destroy(); 
    redirect("/"); 
} 

注意,上面的代碼沒有經過測試,並且只應該給你一個想法在哪裏去。如果會話方法不爲你工作,你可能需要加載庫手動:

//in the __construct method of your controller: 
$this->load->library("session"); 

您可以在這裏找到更多的信息: http://ellislab.com/codeigniter/user-guide/libraries/sessions.html 這裏: http://www.php.net/manual/en/book.session.php

+0

我在上述評論做出之前就開始寫這篇文章,原諒任何冗餘...... –

+0

可以理解。我沒有回答,因爲我沒有代碼點火器的具體答案。很好的例子。 –

0

謝謝您回答傢伙。

這是我後來想到的。我不確定是什麼導致了這一點,但在嘗試了一切之後,會話沒有失效。我將codeigniter上的會話移至數據庫。然後,註銷開始正常工作,在註銷後,如果'被盜'/'保存'的cookie再次被放入瀏覽器,它不會將用戶重新登錄。

那麼,那是什麼解決了它。