2010-03-23 121 views
2

好吧,我很難過,幾個小時一直盯着。Cookie不會未設置

我在用下面的代碼/access/login.php設置cookie:

setcookie('username', $username, time() + 604800, '/'); 

當我嘗試註銷,這是位於/access/logout.php(並重新寫入/訪問/註銷),該cookie似乎不會取消設置。我試過以下內容:

setcookie('username', false, time()-3600, '/'); 

setcookie('username', '', time()-3600, '/'); 

setcookie('username', '', 1, '/'); 

我也嘗試直接點擊/access/logout.php,但它不工作。

在PHP日誌中什麼也沒有顯示。

有什麼建議嗎?我不確定我是否錯過了一些東西,或者發生了什麼,但是已經有數小時的時間盯着這段代碼並嘗試去調試了。

+0

我能夠通過傳遞所有的setcookie()參數來修復它。 當我有機會時,我一定會再仔細研究它。 – 2010-03-23 05:43:04

回答

-2

進行身份驗證使用會話,不使用原料餅乾

http://www.php.net/manual/en/book.session.php

+0

會話和cookie只是一種在無狀態http連接之間存儲持久數據的方式。存儲持久數據的目的之一是用於身份驗證。無論您使用哪種會話或Cookie,都必須始終採取安全措施,以防止未經授權訪問您的應用程序。會話可以被劫持,cookie的值可以被改變。安全並不是使用它,而是爲了防止壞人首先利用它。 – 2010-03-23 04:18:23

+0

我說不要使用這樣的原始餅乾: setcookie('username',$ username,time()+ 604800,'/'); 如果你如此關心會話劫持,然後將IP存儲到會話中並比較...或其他東西。這是如此微不足道。 – Martin 2010-03-23 14:32:12

+0

@Martin,存儲IP並不總是保護你免受會話劫持。如果您位於NAT後面的網絡中,因爲大多數公共訪問點將會在該網絡上的每個人看起來具有相同的IP。防止會話劫持的真正方法是使用HTTPS。如果由於某種原因,您不想使用HTTPS摘要身份驗證是可以的,但我不會依賴它來獲得強大的安全性。 – 2012-08-03 23:13:43

0

是否有可能是一個時區的問題嗎?您是否嘗試過使用過去更遠的設置,如time() - (3600*24)? PHP的文檔說,刪除cookie的內部實現過去使用一年的時間戳。

此外,您應該只能使用setcookie('username', false);而不傳遞過期時間戳,因爲該參數是可選的。也許包括它以某種方式混淆PHP?

+0

只要通過setcookie('username,false);也不起作用。我嘗試清除我的Cookie,多個瀏覽器,多臺機器,多臺服務器......不發生什麼事情! – 2010-03-23 04:22:43

+0

您必須使用與cookie設置時相同的域,路徑,安全和httponly。 (這並非總是如此,但瀏覽器應該這樣做。) – Patrick 2011-08-23 09:02:48

0

如何在應用程序中使用cookies數據?

如果您閱讀了cookies並檢查用戶名是否爲假或不是'',那麼將其設置爲false或''就足夠了,因爲您的應用程序將忽略cookie值。

您最好在cookie值中加入一些安全性,以防止用戶更改其值。您可以看看CodeIgniter會話庫,瞭解CI如何使用散列保護cookie值。未經授權的價值變化將被檢測到,cookies將被刪除。

而且,CI做到這一點殺餅乾:

// Kill the cookie 
    setcookie(
      $this->cookie_name, 
      addslashes(serialize(array())), 
      (time() - 31500000), 
      $this->cookie_path, 
      $this->cookie_domain, 
      0 
     ); 
1

你如何確定它是否未設置?請記住,setcookie()不會將它從當前腳本的$ _COOKIE超全局中刪除,所以如果您調用setcookie()來取消它,然後立即print_r($_COOKIE);,它仍會顯示,直到您刷新頁面。

嘗試在您的瀏覽器中粘貼javascript:alert(document.cookie);以驗證您沒有保存多個Cookie。清除您正在處理的域名的所有Cookie,以確保您開始新鮮。也ini_set(E_ALL);,以確保您不會錯過任何通知。

0

一個簡單而方便的方法,就是用這個附加功能:

function getCookie($name) {   
    if (!isset($_COOKIE[$name])) return false; 
    if ($_COOKIE[$name]=='null') $_COOKIE[$name]=false; 
    return $_COOKIE[$name]; 
} 

function removeCookie($name) { 
    unset($_COOKIE[$name]); 
    setcookie($name, "null"); 
} 

移除一個cookie很簡單:

removeCookie('MyCookie'); 
.... 
echo getCookie('MyCookie'); 
1

似乎是一個服務器的問題。我的最後一個域在PHP錯誤處理上很輕鬆,而新域顯示每一個錯誤。我將兩個站點並排使用,舊的站點應該移除cookie。

0

我有類似的問題。

我發現,無論出於何種原因,呼應東西出來logout.php製成的,它實際上刪除cookie:

echo '{}'; 
setcookie('username', '', time()-3600, '/'); 
0

我有同樣的問題;我註銷(並且我已註銷),手動重新加載index.php,然後再次登錄。然後當我註銷時,我已正確註銷。

註銷是一個簡單的鏈接(index.php?任務=註銷)。該任務將用戶從會話中刪除,並「刪除」(設置值''並設置過期時間)cookie,但是index.php會在此(或全部)任務之後從cookie讀取用戶的身份驗證令牌(與正常操作一樣)。這將重新加載用戶。頁面加載後,瀏覽器將不會顯示身份驗證令牌的Cookie。所以我懷疑cookie是在頁面加載完成後寫入的。

我的簡單解決方案是如果任務設置爲註銷,則不讀取cookie。