我有一个管理页面(../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已设置。饼干就是这样做的:
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();
}
更新:我将此代码添加到echo varibles:
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”测试失败。
答案 0 :(得分:0)
你需要检查几件事。
您应该检查服务器响应HTTP标头,然后查看Set-Cookie标头。如果它存在,那么 setcookie 功能不是问题。您需要检查客户端请求HTTP标头并在那里查找Cookie标头。
但是,您的服务器响应中没有Cookie标头的可能性更大。它可能由于不同的原因而发生,但最有可能是因为“Headers already sent”警告。如果您的配置中有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,我可以使用任何用户的凭据登录。
答案 1 :(得分:0)
我在另一个问题的帮助下想出来了。它确实与Cookies有关。我只需要在setcookie()方法中设置路径和域。
setcookie('username',$ this-&gt;用户名,时间()+(60 * 60 * 24 * 14),'/','domain.com');
我的login.php(首次设置cookie的位置)与浏览器开放的index2.php位于不同的文件夹级别。因此,为'domain.com/folder/HERE'级别的文件夹设置了仅 <(仅限)(这是我的login.php所在的位置:domain.com/CMS/login.php)。
另一方面,我打开浏览器到domain / index2.php,其中没有设置cookie。所以它然后发送到login.php页面,其中cookie已经看到所以它将通过相同的测试它只是字段并将你重定向到我没有登录的index.php。所以这就是为什么我的浏览器打开我在index.php中登录并登录。