2011-04-15 111 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到期时间