【问题标题】:Cookie won't unsetCookie 不会取消设置
【发布时间】:2011-01-30 15:34:23
【问题描述】:

好吧,我被难住了,我已经盯着这个看了好几个小时了。

我在 /access/login.php 设置了一个 cookie,代码如下:

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

当我尝试注销位于 /access/logout.php(并重写为 /access/logout)时,cookie 似乎不会取消设置。我尝试了以下方法:

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

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

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

我也试过直接点击/access/logout.php,但是没用。

php 日志中没有显示任何内容。

有什么建议吗?我不确定我是否遗漏了什么,或者发生了什么,但我花了好几个小时盯着这段代码并尝试调试。

【问题讨论】:

  • 最后我可以通过传入所有 setcookie() 参数来修复它。如果有机会,我一定会再研究一下。

标签: php cookies


【解决方案1】:

我有同样的问题;我注销(并且我已注销),手动重新加载 index.php,然后我再次登录。然后,当我注销时,我已正确注销。

注销是一个简单的链接(index.php?task=logout)。该任务将用户从会话中删除,并“删除”(设置值''并在过去设置过期时间)cookie,但 index.php 将在此(或所有)任务之后从 cookie 中读取用户的身份验证令牌(与正常操作一样)。这将重新加载用户。加载页面后,浏览器将不显示身份验证令牌的 cookie。所以我怀疑 cookie 是在页面加载完成后写入的。

如果任务设置为注销,我的简单解决方案是不读取 cookie。

【讨论】:

    【解决方案2】:

    我也有类似的问题。

    我发现,无论出于何种原因,从 logout.php 中回显某些内容使其实际上删除了 cookie:

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

    【讨论】:

      【解决方案3】:

      似乎是服务器问题。我的上一个域在 PHP 错误处理方面非常轻松,而新域显示了每个错误。我正在并排使用这两个网站,而旧的网站会按原样删除 cookie。

      【讨论】:

        【解决方案4】:

        一个简单方便的方法,就是使用这个附加功能:

        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');
        

        【讨论】:

          【解决方案5】:

          您如何确定它是否未设置?请记住,setcookie() 不会将其从当前脚本的 $_COOKIE 超全局中删除,因此如果您调用 setcookie() 取消设置它,然后立即print_r($_COOKIE);,它仍然会显示,直到您刷新页面。

          尝试在浏览器中粘贴 javascript:alert(document.cookie); 以确认您没有保存多个 cookie。清除您正在处理的域的所有 cookie,以确保您重新开始。另外ini_set(E_ALL); 以确保您不会错过任何通知。

          【讨论】:

            【解决方案6】:

            您也可以从 javascript 中删除 cookie。在这里查看http://www.php.net/manual/en/function.setcookie.php#96599

            【讨论】:

              【解决方案7】:

              您如何在应用程序中使用 cookie 数据?

              如果您读取 cookie 并检查用户名是否为 false 或不是 '',则将其设置为 false 或 '' 就足够了,因为您的应用程序将忽略 cookie 值。

              您最好在 cookie 值中设置一些安全性,以防止用户更改它的值。您可以查看 CodeIgniter 会话库,了解 CI 如何使用哈希保护 cookie 值。将检测到未经授权的值更改并删除 cookie。

              此外,CI 这样做是为了杀死 cookie:

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

              【讨论】:

                【解决方案8】:

                这里可能存在时区问题吗?您是否尝试过使用更远的过去设置,例如time() - (3600*24)? PHP 的文档说删除 cookie 的内部实现使用过去一年的时间戳。

                此外,您应该能够只使用 setcookie('username', false); 而无需传递过期时间戳,因为该参数是可选的。也许包括它会以某种方式混淆 PHP?

                【讨论】:

                • 只是传递 setcookie('username, false);也不行。我试过清除我的 cookie、多个浏览器、多台机器、多台服务器……不知道怎么回事!
                • 您必须使用与设置 cookie 时相同的域、路径、安全和 httponly。 (这并不总是正确的,但它是浏览器应该做的。)
                【解决方案9】:

                使用会话进行身份验证,不要使用原始 cookie

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

                【讨论】:

                • session 和 cookie 只是在无状态 http 连接之间存储持久数据的一种方式。存储持久数据的目的之一是用于身份验证。无论您使用的是会话还是 cookie,您都必须始终采取安全措施来防止未经授权访问您的应用程序。会话可以被劫持,cookie 值可以被改变。安全性不是使用哪个,而是首先防止坏人利用它。
                • 我说过不要像这样使用原始 cookie:setcookie('username', $username, time() + 604800, '/');如果您非常担心会话劫持,那么将 IP 存储到会话中并比较......或其他东西。这太微不足道了。
                • @Martin,存储 IP 并不总能保护您免受会话劫持。如果您在 NAT 后面的网络上,因为大多数公共接入点将是,那么该网络上的每个人都将具有相同的 IP。防止会话劫持的真正方法是使用 HTTPS。如果由于某种原因您不想使用 HTTPS 摘要身份验证是可以的,但我不会依赖它来获得强大的安全性。
                猜你喜欢
                • 2011-07-25
                • 1970-01-01
                • 2014-04-17
                • 2012-09-11
                • 2011-02-20
                • 2015-01-01
                • 1970-01-01
                • 2011-09-17
                • 1970-01-01
                相关资源
                最近更新 更多