【问题标题】:How to (if possible) set and unset session variables/ stop session cookie overwriting?如何(如果可能)设置和取消设置会话变量/停止会话 cookie 覆盖?
【发布时间】:2011-12-21 17:20:51
【问题描述】:

作为背景,这是我的场景:

我正在为特定的利基构建一个自托管平台,该平台的一部分是登录过程,如果经过验证,它将为用户设置一个会话。每次加载管理页面时,都会启动会话并检查变量 $_SESSION['key'] 是否为真。

如果为假,用户将被重定向到登录页面,并显示错误提示他们再次登录。

问题在于,这取决于是否设置了会话 cookie,即当会话 cookie 过期并且会话以 session_start() 启动以检查 $_SESSION['key'] 时,因此创建一个新的会话 cookie默认值(我使用session_set_cookie_params() 更改路径、超时等)使得无法重新登录,因为会话 cookie 不会覆盖我所看到的内容。

为了解决这个问题,我考虑在检查$_SESSION['key'] 时在session_start() 之前使用session_set_cookie_params(5, ..) 之类的东西,这将创建一个5 秒的会话cookie,因此允许在重新登录时创建一个新的cookie中,但我不确定这是否可行 - 而且我也确信必须有一种更有效的方法来设置/取消设置会话变量?

这是我的代码:

如果登录成功则开始会话

if($validated){
    session_set_cookie_params(1800, "/inst", $server_name['home']); 
    session_name("_inst");
    session_start();
    $_SESSION['key'] = true;
}

检查 $_SESSION['key'] 是否仍然为真

session_name("_inst");
session_start();

if(!$_SESSION['key']) {
    header('Location: ' . $server['home'] . '/login/?error=1');
}

任何答案或建议都会很棒,如果您需要澄清任何事情,请询问!

【问题讨论】:

    标签: php session cookies session-variables


    【解决方案1】:

    只需在所有页面上发出 session_start() 即可。这将无条件地为您创建一个会话,然后您可以检查密钥的存在/不存在:

    <?php
    
    session_start();
    
    if (!isset($_SESSSION['key'])) { // never logged in, or were logged in and got logged out
       ... redirect to login ...
       exit();
    }
    
    if ($_SESSION['key'] != 'expected value') { // logged in, but no longer a valid login.
       ... redirect to login ...
       exit();
    }
    

    您根本不必弄乱会话 cookie 设置。将它们保留为默认值,只需检查相关键即可。如果他们不在那里,那么用户没有登录,应该被重定向。

    如果他们的会话已经过期并且 PHP 清理了会话文件,那么他们已经被有效地注销,即使他们有一个它在一个时间点有效的会话密钥,并且应该被重定向到再次登录。

    【讨论】:

    • 我听到你在说什么,但我不需要取消设置密钥吗?我希望在用户需要重新登录之前为用户提供最长的登录时间(例如 12 小时)。如果我不更改默认 cookie 参数,我将如何做到这一点?如果我没有说清楚,我很抱歉,我现在意识到我并没有真正提到我为什么使用session_set_cookie_params() 函数。底线是,除非我让会话停止,否则我需要每 12 小时取消设置/设置 $_SESSION['key'] 变量。
    • 您应该在 php.ini 中设置 cookie 生命周期,因此它在您的所有页面中都是全局的,因此所有 session_start() 调用都会创建一个具有适当到期时间的新 cookie(如果需要) .您还必须确保 PHP 的会话垃圾收集器也不会在 12 小时内启动(还有更多的 .ini 设置),否则您仍然会得到具有有效会话 cookie 的人,但是没有匹配的会话文件,因为 PHP 清理了它。
    • 啊,我没有意识到 PHP 有一个会话垃圾收集器。在这种情况下,我将简单地使用默认值。另外,我完全不匹配会话 cookie 背后的逻辑,我没想到虽然你不能覆盖它的参数,但你仍然可以改变它的键值。我会接受你的回答,因为它确实很有意义,现在我已经考虑过了。
    猜你喜欢
    • 2011-12-16
    • 2016-10-01
    • 2013-02-17
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 2013-03-14
    相关资源
    最近更新 更多