【问题标题】:PHP Logout won't work onlinePHP注销无法在线工作
【发布时间】:2013-07-15 07:07:35
【问题描述】:

我试图在 Internet 和堆栈溢出上查找我的问题,但没有找到解决我问题的答案。所以我有一个为开源项目创建的网站的后端系统。我现在刚刚完成将所有内容转移到我的在线域和数据库。在解决了很多其他问题之后,它现在可以工作了,除了注销。

在我的后端标头中,我有 以下网址

<a href="logout.php"><h1>Logout</h1></a>

logout.php 页面的内容如下:

<?php
session_regenerate_id();
session_start();
session_unset();
$_SESSION = array();
session_destroy();

header("Location: login.php");
?>

离线,通过 MAMP 可以正常工作。但是在线它不会破坏我的会话。我仍然可以访问我的所有会话变量,这使我能够保持登录状态。正如我之前所说,我试图寻找答案,但我似乎没有找到解决我问题的答案。如果有人知道可能出了什么问题,请告诉我。提前致谢!

编辑: 这就是我检查每个后端页面的方式,无论我是否登录:

function sec_session_start() {
    $session_name = 'sec_session_id'; // Set a custom session name
    $secure = false; // Set to true if using https.
    $httponly = true; // This stops javascript being able to access the session id. 

    ini_set('session.use_only_cookies', 1); // Forces sessions to only use cookies. 
    $cookieParams = session_get_cookie_params(); // Gets current cookies params.
    session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly); 
    session_name($session_name); // Sets the session name to the one set above.
    session_regenerate_id(true); // regenerated the session, delete the old one.   
    session_start(); // Start the php session
}

如您所见,@paulprogrammer,我用 cookie 做了一些事情。注销时如何确定销毁?

编辑(2):

好的,感谢 paulprogrammer 提供的指针。我从登录检查功能中删除了 cookie 部分,并将其转换为以下简单功能:

function sec_session_start() {
session_start();
}

这不会创建 cookie,现在它可以工作了。我试图通过官方 php manul 所说的 @http://php.net/manual/en/function.session-destroy.php 来取消设置 cookie,但这并没有做到。所以这就是为什么我转向更简单的工作。因为除了我之外没有多少人会使用后端,而且它似乎工作正常,即使没有 cookie,我称之为完成。这个话题可以关闭了:)

最终编辑(3): 好的,感谢 *@paulprogrammer 它现在也可以与 cookie 一起使用。既然我知道了答案,那么您必须这样做似乎是合乎逻辑的。真傻我。好的,显然我必须设置会话的名称,就像我在会话中所做的那样。我一开始就这样做,在我开始之前。登录检查功能的新更新代码:

<?php
session_name('sec_session_id');
session_start();
setcookie(session_name(), '', 100);
session_unset();
session_destroy();
$_SESSION = array();

header("Location: login.php");
?>

【问题讨论】:

  • 您是否有机会查看 cookie 值,而不是 session 值?
  • @PauProgrammer 我认为您的方向可能是正确的。检查我对原始帖子的编辑以获取更新。
  • 尝试在你的注销脚本中也执行session_name($session_name);,否则PHP只会破坏默认会话cookie。
  • @PaulProgrammer 也可以与编辑 1 中的代码一起使用!太好了,我现在正在使用该解决方案。谢了哥们。我会把它放在最后的编辑 3 中。
  • 很高兴它成功了格伦。将此讨论添加为答案,因此您可以接受它。 :)

标签: php sql session logout


【解决方案1】:

您在设置代码中设置了会话名称,但未能在拆卸代码中设置它。因此,在拆卸过程中,PHP 正在破坏默认会话名称,而不是您的自定义会话名称。注销后,自定义会话名称仍可用于请求。

在任何使用会话操作的地方始终如一地使用session_name() 函数,以确保会话管理始终作用于正确的会话令牌。

在你的 logout.php 中:

<?php
session_name('sec_session_id');

session_regenerate_id();
session_start();
session_unset();
$_SESSION = array();
session_destroy();

header("Location: login.php");
?>

【讨论】:

    猜你喜欢
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 2013-01-24
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多