1

我有一个管理页面 (../index2.php) 我想在第一次打开浏览器时以我的主页 URL 登录。您必须使用用户名和密码登录才能查看此页面。显然,如果我注销并关闭浏览器,然后重新打开,它应该重定向到登录页面。这是 index2.php 页面首次打开时的顶部代码:

<?php
      require_once ("../includes_kl/initialize.php"); // simply sets up database and other classes including session class
?>
<?php
    if(!$session->is_logged_in()) {
    redirect_to("/cms/login.php");
    }
?>

它将重定向到 login.php 页面,但该页面执行以下操作:

require_once ("../../includes_kl/initialize.php");
if ($session->is_logged_in()) {// Skip login page if already logged in.
    redirect_to("index.php");
}

而且因为我现在显然已登录(不确定何时发生),所以它转到 index.php。

当我打开浏览器时,我确认我的 cookie 已设置。cookie 会这样做:

  private function check_login() {

    if (isset($_COOKIE['user_id']) && (isset($_COOKIE['username']))) {
        $_SESSION['user_id']= $_COOKIE['user_id'];
        $_SESSION['username'] = $_COOKIE['username'];

    }

    if (isset($_SESSION['user_id'])) {
        $this->user_id = $_SESSION['user_id'];
        $this->username = $_SESSION['username'];
        $this->logged_in = true;
    } else {
        unset($this->user_id);
        $this->logged_in = false;
    }
}

My session Constructor:

function __construct() {
      session_start();
      $this->check_login();
}

更新:我将此代码添加到回显变量:

function __construct() {
      session_start();
      $this->check_login();
       if ($this->logged_in) {
        echo "Session User Success: " . $this->username;
        } else {
        echo "Session User Fail";
        }
}

当我第一次打开浏览器时,它返回“会话用户失败”(我在 index2.php 中出于测试目的取消了重定向,所以我可以看到结果)。

更新2:

我已经找到了未设置 Cookie 的问题。

这是我设置它们的地方:

public function login($user) {
    global $database;
    if ($user) {
        $this->user_id = $_SESSION['user_id'] = $user->id;
        $this->username = $_SESSION['username'] = $user->username;
        setcookie('user_id', $this->user_id, time() + (60 * 60 * 24 * 14));
        setcookie('username', $this->username, time() + (60 * 60 * 24 * 14));
        $this->logged_in = true;
      }
}

这样做是否正确?这是用户登录时的一部分。我已经在 Chrome 中验证了 cookie 已设置。然而,在 check_login() 方法中,它在第一个“if”语句中找不到它们。“isset”测试失败。

4

2 回答 2

0

你需要检查几件事。

您应该检查服务器响应 HTTP 标头并在那里查找 Set-Cookie 标头。如果它在那里,那么setcookie函数就没有问题。您将需要检查客户端请求 HTTP 标头并在那里查找 Cookie 标头。

但是,更有可能您的服务器响应中没有 Cookie 标头。它可能由于不同的原因而发生,但最有可能是因为“标头已发送”警告。如果您的配置中有 display_errors = off,那么您只能在日志文件中看到此警告。这意味着,您的服务器在调用登录函数之前已经开始数据(即 HTTP 响应正文)传输,并且无法设置任何其他标头。您可以使用标题功能检查它。为此,您需要将此代码放在 index2.php 的开头:

header('Start: OK');

以及 check_login 函数中的这段代码:

header('Check-Login: OK');

之后,您需要检查您的响应中有哪些标题。

还有一件事情。你应该避免这样的结构:

$_SESSION['user_id']= $_COOKIE['user_id'];
$_SESSION['username'] = $_COOKIE['username'];

这是一个真正的安全漏洞。至于我可以在客户端更改 cookie,我可以使用任何用户的凭据登录。

于 2012-05-22T22:02:59.370 回答
0

我在另一个问题的帮助下弄清楚了。它确实与Cookies有关。我只需要在 setcookie() 方法中设置路径和域。

setcookie('username', $this->username, time() + (60 * 60 * 24 * 14), '/', 'domain.com' );

我的 login.php(首先设置 cookie)与浏览器打开的 index2.php位于不同的文件夹级别。所以cookie为'domain.com/folder/HERE'级别的文件夹设置(这是我的login.php所在的位置:domain.com/CMS/login.php)。

另一方面,我将浏览器打开到未设置 cookie 的 domain/index2.php。因此,它会将您发送到看到 cookie 的 login.php 页面,因此它将通过与它相同的测试,并将您重定向到我未登录的 index.php。这就是我的浏览器打开我的原因在 index.php 中并登录。

于 2012-05-23T16:13:11.363 回答