【问题标题】:PHP Session Script Semi-FunctionalPHP 会话脚本半功能
【发布时间】:2013-06-19 03:25:31
【问题描述】:

我昨天在这里发布了一个问题并得到了快速回复。很棒的社区!

我希望有人能帮助我(PHP 新手)了解我的以下脚本及其执行不一致的原因。

我正在使用以下 session.php 文件来检查登录和会话超时:

`

function logged_in() {
    return isset($_SESSION['user_id']);
    session_write_close();
}

function session_expired() {
    $now = time();
    $limit = $now - 7200; // 2 hour
    return isset($_SESSION['last_activity']) && ($_SESSION['last_activity'] < $limit);
    session_write_close();
}

function confirm_logged_in() {
    $now = time();
    if (session_expired()) {
        $_SESSION = array();
        if(isset($_COOKIE[session_name()])) {
        setcookie(session_name(), '', time()-42000, '/');
        }
        session_destroy();
        redirect_to("http://domain.com/login.php?logout=2");
        exit;
    }
    elseif (!logged_in()) {
        redirect_to("http://domain.com/login.php");
        exit;
    }
    else {
        $_SESSION['last_activity'] = $now;
        session_write_close();
    }
}

?>`

然后我在每一页的顶部有:

<?php require_once("../includes/session.php"); ?> <?php require_once("../includes/functions.php"); ?> defines some other functions I use <?php confirm_logged_in(); ?>

发生的事情是 session_expired() 并不总是被触发,而不是 redirect_to("http://domain.com/login.php?logout=2");它转到 redirect_to("http://domain.com/login.php");

谁能看出哪里出了问题?

【问题讨论】:

  • session_write_close() 在您的 return 声明之后。该行不会被执行。
  • 我明白了。我在两个函数logged_in() 和session_expired() 中有两次。在试图弄清楚为什么我的页面有时在第一次尝试时无法加载时,我根据一些研究添加了此内容。

标签: php session timeout


【解决方案1】:

在几个不同的地方,session_write_close()return 之后。 return 语句始终是函数中执行的最后一件事。

另外,只是为了确保您调用 session_start() 是为了真正开始会话,对吧?

【讨论】:

  • 我必须仔细检查(这就是我对这个的新认识,哈哈!)但是是的。我忘了把它加到顶部。它以 session_start() 开始;在函数 logged_in() 之前。我将从这两行中删除 session_write_close() 并尝试一下。你们太有帮助了!
【解决方案2】:

因此,我听取了建议我从代码部分中删除 session_write_close() 的好人的建议。很好的建议!

但是,这并没有解决我的问题。在网站上移动时,我的页面仍然没有加载,这种情况只是偶尔发生。

原来我需要设置 $_SESSION['last_activity'] = time();在我的登录页面中。这解决了问题。现在我的页面加载一致且快速。谢谢大家的帮助!

【讨论】:

  • 嘿迈克,记住他们只是建议你删除那行代码只是因为它在返回后被调用所以它从未被执行,php 默认情况下在 php 脚本完成加载后执行 session_write_close()但是如果您要重定向,则应始终在重定向之前使用 session_write_close()。
  • 谢谢,乔。我实际上已经开始遇到我的密码保护论坛被垃圾邮件机器人发送垃圾邮件的问题。我想知道我的会话是否被劫持还是因为我缺少 session_write_close() 命令?我不知道如何阻止他们。我将发布另一个问题,包括我的登录脚本,看看是否有人能指出安全漏洞。
  • 尝试添加验证码以有效避免机器人向您的网站发送垃圾邮件。
猜你喜欢
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 2012-04-23
  • 2012-07-01
  • 2012-01-15
相关资源
最近更新 更多