【发布时间】:2015-02-17 04:04:16
【问题描述】:
在我的网站上发现了一个大问题。我发现如果我使用用户 A 登录,它有时会登录但实际上没有登录。然后我使用用户 B 登录 -> 进入该站点。我注销然后手动返回到需要登录的 url,它以某种方式与用户 A 一起进入。似乎我在不同的选项卡上有两个(可能有更多)session_id cookie,或者有一个幽灵 session_id 活跃我不知道。把我的头发拉到这里来。
还发现,假设我有一个用户仪表板和测试页面。随着不同的凭据来回走动。我得到这个结果: 仪表板回显用户 A 的 ID,测试回显用户 B 的 ID 或根本不回显 ID。我的会话到底做错了什么? 登录是使用 AJAX 完成的。每个页面的登录验证都是相同的。
常用功能:
function validateUser($userid) {
session_regenerate_id();
$_SESSION['valid'] = 1;
$_SESSION['usersid'] = $userid;
}
function isLoggedIn() {
if (isset($_SESSION['valid']) && $_SESSION['valid'] == 1) {
return true;
} else {
return false;
}
}
function logout() {
$_SESSION = array();
session_unset();
session_destroy();
}
登录/数据库: 登录页面:
session_start();
include 'include_files.php';
if(isLoggedIn()){
header('Location:loginrequiredpage.php');
die();
}
登录页面通过 AJAX 将用户名/密码发送到使用 db 函数作为包含文件的控制器 php 文件。它执行 usercheckfunc() 从 db 检查用户,然后回显成功或失败返回到 ajax。
来自 db 函数 - 用户检查函数的一部分
//if user found from db and password hash match
validateUser(**ID FROM DATABASE**);
如果 ajax 返回成功消息,则返回登录页面,JS 将用户发送到登录所需的 url。 这里有时会发生神秘事件 浏览器的行为就像我刚刚登录到某个地方,但登录页面又被加载了。有时我可以通过地址栏手动转到登录所需的页面。有时,如果我注销/空闲时间过长等并使用不同的用户名/密码登录,我会以错误的用户身份进入。以用户 A 的身份输入,查看用户 B 的数据或在页面上回显不同的用户 ID,或仅在其他页面上回显 ID。
需要登录的页面:
<?php
session_start();
require_once 'include_files.php';
if (!isLoggedIn()) {
logout();
header('Location:login.php');
die();
}
echo $_SESSION['usersid'];
测试页面:
<?php
session_start();
error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once 'include_files.php';
if (!isLoggedIn()) {
logout();
header('Location:login.php');
die();
}
echo $_SESSION['usersid'];
是否有管理会话的“最佳”方式?非常感谢您的帮助:)
【问题讨论】:
-
也许你遇到了 session_regenerate_id 问题
-
@MarcoMura 我也是这么想的。为什么甚至需要重新生成会话 ID?恕我直言,PHP 会话可以很好地处理自己,您只需要关心在登录时创建会话并取消设置以及在注销时销毁它。
-
我同意 Marco 的观点,我之前在使用会话重新生成 ID 时遇到过同样的问题。
-
我一直在考虑这个问题,但我不知道什么是最有效的使用方法。
-
我认为他的意思是删除对 session_regenerate_id() 的调用。