Session variables not working? (PHP)

I have a problem with 2 files: login_config.php

and profile.php

.

  • login_config.php consists of a login system that sets $ _SESSION ['key'] true when multiple forms of authentication are completed.
  • profile.php is the page the user is redirected to after success.

I want the data on profile.php to only be accessible with $ _SESSION ['key'] set (after successful login).

My question is, what is wrong with my code? Also, why am I presenting a login error that should only be returned if $ _SESSION ['key'] is invalid / not set, as opposed to the profile.php landing page?

CODE: (login_config.php)

<?php

// POST VARIABLES
$submit = $_POST['login_submit'];
$username = $_POST['login_username'];
$password = $_POST['login_password'];
$email = $_POST['login_email'];

require 'password_config.php';

if(isset($submit)){

    require 'db/connect.php';

    // PASSWORD VERIFYING
    $pass_query = "SELECT password FROM users WHERE email='$email'";
    $queried = mysql_query($pass_query);
    while($row = mysql_fetch_array($queried)){
        $user_pass = $row['password'];
        $veri_password = password_verify($password, $user_pass);
    }
    if(!$veri_password === true){$errors[] = '-Account does not exist ';}

    // CHECKING NUM ROWS
    $sql = "SELECT id, username FROM users WHERE password='$user_pass' AND email='$email'";
    $entered_user = mysql_query($sql);
    $num_rows = mysql_num_rows($entered_user);


    // ERRS ARRAY ESTABLISHED
    $errors = array();

    // FURTHER VERIFYING
    if( empty($password) || empty($email) )
    {
        $errors[] = 'Please do not leave fields empty';
    }
    elseif( $num_rows != 1 )
    {
        $errors[] = '-Account does not exist ';
    }
    elseif( $num_rows == 1 )
    {
        session_start();
        $_SESSION['key'] === true;

        while($row = mysql_fetch_array($entered_user)){
            $_SESSION['id'] = $row['id'];
            $_SESSION['email'] = $email;
            $_SESSION['user'] = $row['username'];
            $_SESSION['pass'] = $password;
            header('Location: profile.php');
            exit();
        }

    }
}   

      

CODE: (profile.php)

<?php

session_start();

if($_SESSION['key'] !== true){
    die ("please <a href='login.php'>log in</a> to view this page");
}
?>
<html>
<head>
    <title>Profile</title>
    <link href='css/main.css' rel='stylesheet' />
</head>
<body>
    <div id='container'>
        <?php require 'include/header.php'; ?>
        <?= 'NJM ID # ==>'.$_SESSION['id'].'<br />'.'Username ==>'.$_SESSION['user'].'<br/>'.'Password ==>'.$_SESSION['pass'].'<br/>'.'<br />' ?>
        <a href='logout.php'>Log out!</a>
        <br />
        -OR-
        <br />
        <p>Try our beta mode<a href='forum.php'> forum</a></p>
        <?php require 'include/footer.php'; ?>
    </div>
</body>
</html>

      

Note. I know that I am vulnerable to SQL attacks in the current state of the code, I will fix this later, also I am stuck with an outdated MySQL version.

+3


source to share


4 answers


As profile.php

you need to call session_start();

before using $_SESSION

. session_start()

will not just start a new session, but will also continue the existing session (it will "trigger" the session handling functions if you do). Without calling it, you cannot use $_SESSION

.



+4


source


1st: I would use thermal operators to check for the existence of the values ​​I need to avoid the "undefined index_ login_username" error. Like this:

$username = isset($_POST['login_username']) ? $_POST['login_username'] : '';
$password = isset($_POST['login_password']) ? $_POST['login_password']) : '';
$email = isset($_POST['login_email']) ? $_POST['login_email'] : '';

      



2nd: I would use PDO to connect to MySQL server for security reasons and more.

session_start();

if (isset($submit)){
    // select all data from db for the current user
    $st = $db->prepare('SELECT * FROM users WHERE email=?');
    $st->execute([$email]);
    //$rows = count_rows_here
    if($rows == 1){
        $row = $stmt->fetch();
        if(password_verify($password, $row['pass'])){
            $_SESSION['key'] = true; // notice the '=', and not '==='
            $_SESSION['id'] = $row['id'];
            $_SESSION['email'] = $row['email'];
            $_SESSION['user'] = $row['username'];
            $_SESSION['pass'] = $row['password'];
            header('Location: profile.php');
       } else {
           echo 'Error!';
       }
   }
}

      

+1


source


I would try to remove the call first exit()

after you have navigated to the next PHP page. This is optional since you don't have the code below and it might affect the session (I don't think so)

If that doesn't work (it probably won't), add in profile.php

after you've started a session var_dump($_SESSION)

and view its contents.

0


source


I fixed this by assigning the $ _SESSION ['key'] variable to a variable with a value.

$_SESSION['key'] = $check = 'check';

      

Then, to check this in my profile.php file, I entered the following code:

if(isset(!$_SESSION['key'])){die ('example')}

      

0


source







All Articles