session_destroy() 没有让我退出

Posted

技术标签:

【中文标题】session_destroy() 没有让我退出【英文标题】:session_destroy() is not logging me out 【发布时间】:2018-05-16 22:43:23 【问题描述】:

每当我运行 logout.php 脚本然后返回到未登录的受保护页面时,我仍然会登录

注销.php

<?php

session_start(); 
session_unset();
session_destroy();
header("Location: ../index.php");
exit();
?>

登录.php

$userlogin = user_login($email, $password.$salt);
    if ($userlogin==false)
        $errors[]='Wrong email/password combination.';
     else 
    //set the user session
        $_SESSION['UserId']=$userlogin;
        $_SESSION['LoginIP']=$_SERVER['REMOTE_ADDR'];
        $db->query("UPDATE users SET ipadd='".$_SERVER['REMOTE_ADDR']."' WHERE user_id=".$_SESSION['UserId']."");
        echo '<meta http-equiv="refresh" content="0; URL=index.php">';  

检查登录sn -p

/* Check if user is logged in or not */
function loggedin()
return (isset($_SESSION['UserId'])) ? true : false;

if (loggedin()==true)
$session_user_id = $_SESSION['UserId'];
$user_data = user_data($session_user_id,'full_name','username');
$rezult =$db->query("SELECT ipadd FROM users WHERE user_id=".$_SESSION['UserId']."");
while($rez = $rezult->fetch_assoc())
    if  ($rez['ipadd']==$_SERVER['REMOTE_ADDR']) 
     else 
    echo '<meta http-equiv="refresh" content="0; URL=logout2.php">';
    



看过有同样问题的帖子,但无论我尝试什么,仍然遇到同样的问题。任何建议将不胜感激!

【问题讨论】:

【参考方案1】:

这是来自 php.net http://php.net/manual/en/function.session-destroy.php 注意:您不必从通常的代码中调用 session_destroy()。清理 $_SESSION 数组而不是销毁会话数据。

所以你只需要 $_SESSION = null 就可以退出了。

【讨论】:

【参考方案2】:

我认为在你的 index.php 文件中应该有这些行:

if(!isset($_SESSION["session_name"]))
     header("Location: somewhere_mainpage.php");

最好让所有页面都有这些行。如果没有会话开始,这些行会将标题发送到另一个页面。

【讨论】:

【参考方案3】:

我相信session_start();函数调用应该在用户登录数据正确的情况下在你的登录页面上,并且在你的注销PHP代码中,你应该设置

session_destroy();unset($_SESSION['UserId'];

注销.php:

 <?php
    session_destroy();
    /* * OR * */
    //unset($_SESSION['UserId'];
    header("Location: ../index.php");
    exit();
    ?>

【讨论】:

我同意。 session_start(); 应该在每一页上。我只能假设 OP 有它,因为 login.php 看起来像部分代码。【参考方案4】:
<?php
session_unset();
session_destroy();
header("Location: ../index.php");
?>

应该可以,否则你可以取消设置值

<?php
unset($_SESSION['UserId']);  // Unsets the UserId Variable reuse for each variable 
session_destroy();
header("Location: ../index.php");
?>

你试过 session_destroy() 吗?

我也不确定你在关闭会话时是否需要 session_start(),从内存中你只需要它来启动会话

【讨论】:

【参考方案5】:

我总是喜欢销毁服务器会话和客户端cookie,尝试手动覆盖所有选项以防出现任何错误。

您可以使用以下方法在 PHP 中销毁 cookie:

setcookie(session_name(), '', time() - 3600, $cookie_path, $cookie_domain, $cookie_secure, $cookie_httponly );


<?php
$cookie_path = "...";
$cookie_domain = "...";
$cookie_secure = "...";
$cookie_httponly = "...";

session_start();
session_unset();
session_destroy();
setcookie(session_name(), '', time() - 3600, $cookie_path, $cookie_domain,$cookie_secure, $cookie_httponly );
header("Location: ../index.php");
exit();

time() - 3600 使 cookie 在当前时间之前过期,使其失效。

另一个调查选项是在您的注销页面上session_regenerate_id()。一些参考页面如下:

php.net - session-regenerate-id

https://***.com/a/22965580/1246494

【讨论】:

以上是关于session_destroy() 没有让我退出的主要内容,如果未能解决你的问题,请参考以下文章

PHP网站让我退出,可能是啥? [关闭]

session_destroy() 不工作

当站点的用户注销或登录时,`session_destroy()` 是个好主意吗?

从控制台(Ctrl-C)终止时让我的 PyQt 应用程序退出的正确方法是啥?

会话未设置,还是 session_destroy? [复制]

中间件身份验证让我退出?编辑: RedirectIfAuthenticated 让我退出?