PHP - 会话不匹配,不同的id和错误的用户,劫持风险和主要的安全风险

时间:2014-12-18 11:21:24

标签: php ajax session

在我的网站上发现了一个主要问题。我发现如果我用用户A登录,它有时会有一些登录但实际上并没有。然后我用用户B登录 - >进入网站。我注销然后手动返回到需要登录的URL,它以某种方式与用户A一起进入。似乎我在不同的选项卡上有两个(可能有更多)session_id cookie或者有一个ghost 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();
}

LOGIN / DB: 登录页面:

    session_start();
include 'include_files.php';

if(isLoggedIn()){
    header('Location:loginrequiredpage.php');
    die();
}

登录页面使用AJAX将用户名/密码发送到使用db函数作为包含文件的控制器php文件。它执行usercheckfunc(),它从db检查用户,然后回应成功或失败回到ajax。

来自db functions - 用户检查功能的一部分

//if user found from db and password hash match
validateUser(**ID FROM DATABASE**);

返回登录页面,如果ajax获得成功消息,JS将用户发送到登录所需的URL。 这里有时会出现神秘感浏览器的行为就像我刚刚登录某处,但登录页面再次加载。有时我可以通过地址栏手动登录所需的页面。有时如果我退出/闲置太久等,并使用不同的用户名/密码登录,我会以错误的用户身份进入。输入为用户A,查看用户B的数据或在页面上回显不同的用户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'];

是否有最好的&#34;管理会话的方式?非常感谢帮助:)

1 个答案:

答案 0 :(得分:0)

通过在执行session_start之前手动设置会话cookie参数来解决问题。现在,会话cookie域不会出现意外行为。对不起,不知道为什么它之前做了那个神秘的改变。

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

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