gpt4 book ai didi

页面之间丢失的 PHP session - 行为因服务器而异

转载 作者:可可西里 更新时间:2023-10-31 23:14:45 25 4
gpt4 key购买 nike

我花了几个月的时间在我的域上开发一个应用程序。总体而言,这是一个简单的概念。在开发过程中,我自己将其托管在自己的域中,但最近将其推送到我们的实际域中。问题是 session 不会在页面之间创建或保留,我终究无法弄清楚原因。

为下面的代码墙道歉,但我更喜欢它而不是理论解释。

让我们从我如何在每一页的顶部开始我的 session 开始:

function sec_session_start() {
$session_name = 'login';
$secure = false;
$httponly = true;

ini_set('session.use_only_cookies', 1);
session_set_cookie_params(86400, '/', '.domain.com', $secure, $httponly);
session_name($session_name);
session_start();
session_regenerate_id();
}

然后我如何检查用户是否已登录。我添加了 return x; 而不是 false 用于调试。我将其附加到重定向 URL。

function login_check($mysqli) {
if(isset($_SESSION['id'], $_SESSION['login_string'], $_SESSION['type'])) {
$id = $_SESSION['id'];
$login_string = $_SESSION['login_string'];

$user_browser = $_SERVER['HTTP_USER_AGENT'];

if($_SESSION['type'] == 1 || $_SESSION['type'] == 2) // Admin user
{

if ($stmt = $mysqli->prepare("SELECT `password` FROM `users` WHERE `id` = ? LIMIT 1")) {
$stmt->bind_param('s', $id);
$stmt->execute();
$stmt->store_result();

if($stmt->num_rows == 1) {
$stmt->bind_result($password);
$stmt->fetch();
$login_check = hash('sha512', $password.$user_browser);
if($login_check == $login_string) {
return true;
} else {
return 1;
}
} else {
return 2;
}
} else {
return 3;
}
} else if($_SESSION['type'] == 3) { // Standard user
if($stmt=$mysqli->prepare("SELECT `password` FROM `proj` WHERE `id` = ? LIMIT 1"))
{
$stmt->bind_param("s", $_SESSION['id']);
$stmt->execute();
$stmt->store_result();

if($stmt->num_rows == 1)
{
$stmt->bind_result($db_key);
$stmt->fetch();
$login_check = hash('sha512', $db_key.$user_browser);
if($login_check == $login_string) {
return true;
} else {
return 4;
}
}
}
} else {
return 5;
}
} else {
return 6;
}
}

我有两个登录页面,一个用于管理员,一个用于用户。

管理员:

<?php

ini_set('display_errors','On');
error_reporting(E_ALL);

include_once "../functions.php";
include_once "../db_connect.php";

sec_session_start();

if(login_check($mysqli) === true) {

header('Location: ../index.php');

}
else
{

// Login form

}

用户:

<?php

ini_set('display_errors','On');
error_reporting(E_ALL);

include_once "../functions.php";
include_once "../db_connect.php";

sec_session_start();

if(login_check($mysqli) === true) {

header('Location: ../index.php');

}
else
{

// Login form

}

完全相同,除了文件源,因为管理 login.php 位于 /admin。尽管如此,第一个正确显示登录表单,而第二个将您重定向到 index.php(即使在隐身模式下,这对我来说还是个谜),导致重定向循环(如 index.php )。 php 发回 nog 登录)。

除此之外,当我使用正确的凭据登录时,它确实将我定向到 index.php 只是将我重定向回 login.php 并显示错误代码 6

如果您需要更多信息或代码示例,请发表评论,我现在对自己的项目感到迷茫。

感谢任何帮助,谢谢

12 月 17 日更新:

经过几个小时的调试,我们得出结论,问题不在于代码,而在于服务器配置。一个简单的例子:

<?php

session_start();
echo session_id();

?>

如果您在生产服务器上打开此文件并刷新页面,它会为每个请求显示一个新的 session ID。我目前不知道为什么。我已经确认创建了 session 文件以及 cookie。它包含正确的信息,可以通过具有服务器权限的 SSH 访问。确实有些奇怪的行为。

有什么线索吗?

最佳答案

我已经检查了你的代码,除了一件事之外我没有发现任何不寻常的地方。

你不应该使用 == 进行字符串比较 === 是可以的。

$something = 0;
echo ('password123' == $something) ? 'true' : 'false';

运行上面的代码,你会发现 session 丢失的原因。在您的函数 login_check 中,您使用 == 比较两个字符串

 if($login_check == $login_string)

替换为:

 if($login_check === $login_string)

其他一切都绝对没问题。如果改变这件小事不能解决您的问题,请告诉我。

建议

您在 session 开始前连接到数据库。我建议您导入您的函数,然后启动您的 session ,然后连接到您的数据库。

include_once "../functions.php";
sec_session_start();
include_once "../db_connect.php";

关于页面之间丢失的 PHP session - 行为因服务器而异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34222862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com