读取时会话值错误


Wrong session value when reading

我遇到了这个奇怪的问题。我想制作一个使用用户名来标识应显示哪些内容的页面。它似乎工作正常,除了一件事。从一个特定页面上的会话中读取错误的值。我已经在浏览器中检查了会话值,但该值似乎是正确的。我将向您展示代码:

这是我使用 PHP 的登录函数:

<?php
//CONNECT TO DATABASE
$db = mysqli_connect("localhost","root","MyPassword","MyDBName");
if($db->connect_errno){
die('connection error: ' . $db->connect_errno);
}
   //CHECK IF LOGIN DATA IS SUBMITTED AND IS CORRECT
if(isset($_POST['action'])){
switch($_POST['action']){
    case "login":
        $pw = $_POST['pw'];
        $loginUn = $db->real_escape_string($_POST['loginUn']);
        $result = mysqli_query($db,"SELECT `Password` FROM `accounts` WHERE `Username`='" .$loginUn. "'");
        if(mysqli_num_rows($result) != 0){
            $dbpw = $result->fetch_object();
            $VI = explode("-",$dbpw->Password);
            $dbpw = openssl_decrypt($VI[1],"blowfish","",0,$VI[0]);
            if($pw == $dbpw){
                $login = true;
                $_SESSION['login'] = true;
                $_SESSION['Username'] = $_POST['loginUn'];
                $un = $_POST['loginUn'];
            }
        }
        break;
    case "logout":
            $_SESSION['login'] = false;
            $_SESSION['Username'] = "";
        break;
}
}else{
    if(isset($_SESSION['login'])){
        $login = $_SESSION['login'];
        $un = $_SESSION['Username'];
    }
}
?>

它似乎工作正常,因为它在使用它的页面中工作。我在数据库中制作了一些虚拟帐户,用户名如下:管理员和用户。这是出错的页面的代码:

.PHP:

//THIS IS NOT THE SAME PAGE AS THE PREVIOUS PHP CODE
$login = false;             //CHECK IF USER HAS LOGGED IN
$un = "";                   
if(isset($_SESSION['login'])){
$login = $_SESSION['login'];        //IF LOGGED IN SET TO SESSION VALUE
$un = $_SESSION['Username'];        //SET $UN TO USERNAME IN SESSION
}

然后我使用 javascript 和 php 来提醒变量包含的值:

<script type="text/javascript">
    alert("$un = <?php echo $un;?>");
</script>

使用登录变量似乎没有问题,因为它具有良好的价值,但变量$un是错误的。当我没有登录时,它没有值,这是正确的,但是当我登录时,它包含值 Admin,即使我没有使用 Admin 登录。在浏览器选项中,cookie值似乎是正确的。我已经检查了每个页面上的cookie,它工作得很好,只是不在这个页面上。我做错了什么,使浏览器(顺便说一下,是火狐)认为登录的始终是管理员?

如前面的评论中所述,脚本中存在许多安全风险。

您应该查看 PHP 的会话来构建您的登录名。使用会话时,只有一个 cookie 存储一个 ID,所有数据都将存储在您的服务器上,用户无法修改。

"管理员"保留为 cookie 值的问题可能是缓存问题。

我刚刚发现我做错了什么。一段我认为无关紧要的代码,错过了 a =,因此没有比较变量,而是设置为这个错误的值。