繁体   English   中英

(PHP)尝试在管理页面上执行某操作后,用户被迫重新登录

[英](PHP) User is being forced to RE-LOGIN after trying to do something on an admin page

我已经为PHP中的客户端创建了一个管理面板,需要登录。 以下是管理页面顶部要求用户登录的代码:

admin.php

<?php
session_start();
require("_lib/session_functions.php");
require("_lib/db.php");
db_connect();


//if the user has not logged in
if(!isLoggedIn())
{
    header('Location: login_form.php');
    die();
}
?>

显然,if语句捕获了它们并迫使它们登录。这是生成的登录页面上的代码:

login_form.php

<form name="login" action="login.php" method="post">
    Username: <input type="text" name="username" />
    Password: <input type="password" name="password" />
    <input type="submit" value="Login" />
</form>

哪些信息发布到此控制器页面:

login.php

<?php
session_start(); //must call session_start before using any $_SESSION variables
include '_lib/session_functions.php';

$username = $_POST['username'];
$password = $_POST['password'];

include '_lib/db.php'; 
db_connect(); // Connect to the DB

$username = mysql_real_escape_string($username);

$query = "<grab username, hashed password from DB>;";
$result = mysql_query($query);

if(mysql_num_rows($result) < 1) //no such user exists
{
    header('Location: login_form.php?login=fail');
    die();
}

$userData = mysql_fetch_array($result, MYSQL_ASSOC);
db_disconnect();
$hash = hash('<myHashingFunction>', $password . $userData['salt']);

if($hash != $userData['password']) //incorrect password
{
    header('Location: login_form.php?login=fail');
    die();
}
else
{
    validateUser(); //sets the session data for this user
}

header('Location: admin.php');

?>

提供登录功能的会话功能页面包含以下内容:

session_functions.php

<?php
function validateUser()
{
    session_regenerate_id (); //this is a security measure
    $_SESSION['valid'] = 1;
    $_SESSION['userid'] = $username;
}

function isLoggedIn()
{
    if($_SESSION['valid'])
        return true;

    return false;
}

function logout()
{
    $_SESSION = array(); //destroy all of the session variables
    if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
            $params["path"], $params["domain"],
            $params["secure"], $params["httponly"]
        );
    }
    session_destroy();
}
?>

我获取了在线教程的sessions_functions.php代码,因此可能会令人怀疑。

为什么用户登录管理面板尝试执行某项操作,被迫重新登录,然后允许THEN在管理面板中执行类似常规的操作?

将session_regenerate_id与重定向一起使用时要小心。 一般来说。 别。

如果客户端切换服务器,请记住清除浏览器cookie :)

仅仅是我,还是您的isLoggedIn函数确实不安全? 您要做的只是检查会话变量的存在,任何人都可以使用随机值伪造该变量。 您需要根据经过验证/登录的用户的数据库检查实际的会话ID /哈希。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM