2011-04-15 153 views
2

我有一個基本的登錄系統。基本登錄/註銷功能如下:cookies不被刪除

function login() { 
    global $page; 

    if ($_COOKIE['adminUser'] == adminUser && $_COOKIE['adminPass'] == adminPass): 
     $_SESSION['adminLogin'] = true; 
     redirect($_SERVER['REQUEST_URI']); 
    elseif ($_POST['adminUser'] == adminUser && $_POST['adminPass'] == adminPass): 
     setcookie('adminUser', $_POST['adminUser'], time() + 60 * 60 * 24 * 7); 
     setcookie('adminPass', $_POST['adminPass'], time() + 60 * 60 * 24 * 7); 
     $_SESSION['adminLogin'] = true; 
     redirect($_SERVER['REQUEST_URI']); 
    else: 
     $page->content->table = new template('admin/login.tpl'); 
     // it shows the login form 
    endif; 
} 

    function logout() { 
     $_SESSION['adminLogin'] = false; 
     setcookie('adminUser', false, time() - 60*100000); 
     setcookie('adminPass', false, time() - 60*100000); 
     redirect(pathApp); 
    } 

redirect($x)header("Location: $x"); die;

在整個劇本的任何地方都沒有設置其他的COOKIES。

問題是註銷功能不起作用。我試圖通過Firebug進行調試,看看有哪些頭文件正在發送,並且對我來說一切似乎都沒問題。這裏是螢火蟲的登出日誌:

Response Headers 

HTTP/1.1 200 OK 
Date: Fri, 15 Apr 2011 18:48:57 GMT 
Server: Apache 
X-Powered-By: PHP/5.2.13 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Set-Cookie: adminUser=deleted; expires=Thu, 15-Apr-2010 18:48:56 GMT 
adminPass=deleted; expires=Thu, 15-Apr-2010 18:48:56 GMT 
Content-Length: 1041 
Connection: close 
Content-Type: text/html 


Request Headers 

GET /freeads/admin/logout HTTP/1.1 
Host: clienti.bsorin.ro 
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 115 
Connection: keep-alive 
Referer: http://clienti.bsorin.ro/freeads/admin 
Cookie: adminUser=q; adminPass=q; PHPSESSID=22faf6e20467b88d97dc7838572cbd47 

該腳本是在http://clienti.bsorin.ro/freeads/admin。用戶名和密碼都設置爲'q'。

謝謝!

+2

請勿使用相對時間值來刪除Cookie。它假設客戶的時鐘是準確的,但情況並非總是如此。要刪除cookie,請始終使用固定的「古代」日期,如Jan 1/1970 00:00:01。並且請告訴我,您不在該cookie中存儲用戶名/密碼...請請告訴我您不是。 – 2011-04-15 18:58:57

+0

@Marc:此時我在COOKIE中存儲用戶名/密碼。不要擔心,但它絕對不是最終的。我以爲'time() - 60'實際上是在發送服務器時間( - 60)。我嘗試了它像'setcookie('adminUser',false,1)'但仍然沒有運氣。 – 2011-04-15 19:04:24

回答

16

看起來系統有缺陷,因爲我沒有正確設置cookie。我沒有使用path參數。 Cookie設置爲/path/login,並且在path/logout處被刪除。

正確的方法將是改變兩個setcookie()命令對(登錄&註銷),用於:

setcookie('adminUser', $_POST['adminUser'], time() + 60 * 60 * 24 * 7, '/'); 
setcookie('adminPass', $_POST['adminPass'], time() + 60 * 60 * 24 * 7, '/'); 

setcookie('adminUser', false, time() - 60*100000, '/'); 
setcookie('adminPass', false, time() - 60*100000, '/'); 

通知第四參數,path,設定爲/。花了我一段時間,但我知道了:)。

0
  1. 檢查您在使用setcookie之前是否沒有發送任何頭文件。
  2. 改變你的條件語句使用curlybraces(我求求你了)
  3. 確保你設置的Cookie /刪除它們在同一個域(和路徑)嘗試使用setcookie($name, $val, $time, '/');

我可以看到以下當註銷被調用時出錯。

DEBUGGING: [class_dispatcher.php:26] [標量 [整數/浮點值/串/布爾]] PAGE->含量爲類 '模板'

這是最有可能的不原因 - 在調用setcookie之前輸出。

+0

我必須一直保存文件。另外,爲什麼點數2? (關於花括號)。謝謝! – 2011-04-15 19:43:56

+0

最突出的PHP編碼標準都推薦大括號:http://pear.php.net/manual/en/standards.control.php 你真的不明白爲什麼嗎? – 2012-06-19 15:36:38

1

我注意到你正在使用一個子域。 setCookie具有指定域的第五個參數。子域名刪除cookies非常棘手。這對我有效

setCookie("clockInTime", $param, date('U')+86502,'/', '.mywebsite.com') 

最後一個參數將使用'。'選取mywebsite的任何和所有子域。在域名之前。

0

您可以使用setcookie()更改cookie的到期時間。

重要事項:在任何數據發送到瀏覽器之前必須更新cookie的到期時間,因爲瀏覽器會根據從服務器發送到瀏覽器的標頭識別cookie並將其存儲起來,因此您必須在標頭之前使用setcookie()用於更新Cookie到期時間