【问题标题】:PHP - Session mismatch, different id and wrong user, hijack risk and a major security riskPHP - 会话不匹配、不同的 id 和错误的用户、劫持风险和重大安全风险
【发布时间】: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() 的调用。

标签: php ajax session


【解决方案1】:

通过在执行 session_start 之前手动设置会话 cookie 参数解决了这个问题。现在会话 cookie 域不会出现异常行为。抱歉,不知道它之前为什么会发生这种神秘的变化。

此 cookie 参数将其设置为在整个域上有效。我想这在您需要在同一个域上进行不同会话(不同的应用程序等)的情况下并不好。但对我来说,这是我需要的治疗补丁。

session_set_cookie_params(0, '/', '.example.com');
session_start();

【讨论】:

    猜你喜欢
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多