【问题标题】:cookies not being deletedcookie 未被删除
【发布时间】:2011-08-06 13:41:45
【问题描述】:

我有一个基本的登录系统。基本的登录/注销功能如下:

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 进行调试,以查看正在发送哪些标头,并且对我来说一切正常。这是 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”。

谢谢!

【问题讨论】:

  • 不要使用相对时间值来删除 cookie。它假设客户的时钟是准确的,但情况并非总是如此。要删除 cookie,请始终使用固定的“古老”日期,例如 Jan 1/1970 00:00:01。请告诉我您没有在该 cookie 中存储用户名/密码...请告诉我您没有。
  • @Marc:此时我将用户名/密码存储在 COOKIE 中。不过不用担心,这绝对不是最终的。我以为time() - 60 实际上是在发送服务器时间(- 60)。我像setcookie('adminUser', false, 1) 一样尝试过,但仍然没有运气。

标签: php cookies setcookie


【解决方案1】:
  1. 在使用 setcookie 之前检查您没有发送任何标头。
  2. 更改条件以使用花括号(求求你了)
  3. 确保在同一域(和路径)上设置 cookie/删除它们尝试使用setcookie($name, $val, $time, '/');

调用注销时,我可以看到以下错误。

调试: [class_dispatcher.php:26] [标量 [整数/浮点数/字符串/布尔值]] 页面->内容不属于类 '模板'

这很可能是原因 - 因为它是在调用 setcookie 之前输出的。

【讨论】:

  • 我当时一定在保存文件。另外,为什么是第 2 点? (关于花括号)。谢谢!
  • 最著名的PHP编码标准都推荐大括号:pear.php.net/manual/en/standards.control.php你真的不明白为什么吗?
【解决方案2】:

似乎系统一开始就有缺陷,因为我没有正确设置 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,被设置为/。花了我一段时间,但我想通了:)。

【讨论】:

    【解决方案3】:

    我注意到您正在使用子域。 setCookie 有第五个参数,用于指定域。使用子域删除 cookie 很棘手。这对我有用

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

    最后一个参数将使用 '.' 选择 mywebsite 的所有子域。在域之前。

    【讨论】:

      【解决方案4】:

      您可以使用 setcookie() 更改 cookie 的过期时间。

      重要提示:在将任何数据发送到浏览器之前,必须更新 cookie 的到期时间,因为浏览器会根据从服务器发送到浏览器的标头来识别 cookie 并存储它,因此您必须在之前使用 setcookie()用于更新 cookie 过期时间的标头

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-18
        • 1970-01-01
        • 1970-01-01
        • 2016-02-14
        • 1970-01-01
        • 1970-01-01
        • 2013-12-05
        相关资源
        最近更新 更多