Проверьте переменную сессий, которая может не существовать - PullRequest
0 голосов
/ 21 марта 2020

У меня есть сеанс, который запускается, если пользователь входит в систему, но может быть нажата определенная часть кода с запросом переменных сеанса, которые могут еще не существовать, есть ли еще способ проверить переменную здесь или есть другой способ go об этом.

PHP выполняет скрытие поля, если пользователь не является администратором, но эта проверка может произойти до того, как пользователь войдет в систему. Как бы я go проверил значение этой переменной сеанса?

Я пытался переместить код, чтобы скрыть окно на отдельной странице, например на странице входа в систему, но безрезультатно, что вход в систему - это всплывающее окно, кстати, не другое окно.

session_start();

$connect= new mysqli('localhost', 'root', '', 'login') or die("connection failure, please try again later");

$username= $_GET["username"] ?? '';
$password= $_GET["password"] ?? '';

echo "<br>","$username";

$getsalt="SELECT * FROM users WHERE uname='$username'";

$salt= $connect->query($getsalt);

$currentsalt = "";

while($row=$salt->fetch_assoc()) {
    $currentsalt = $row["salt"];
    $_SESSION["uname"] = $row["uname"];
    $_SESSION["id"] = $row["id"];
    echo'<br>', 'is admin ', $row['is_admin'];
    $_SESSION["is_admin"] = 1;
    if($row["is_admin"] == 1) {
        echo 'is  admin';
        $_SESSION["is_admin"] = 1;
    } else {
        echo 'is not admin';
    }
}
echo "<br>","$password";
echo "<br>", $currentsalt;

if($currentsalt == null) {
        echo "user doesnt exist";
} else {
$hashed= sha1($password.$currentsalt);

echo "<br>", $hashed;

$getaccount="SELECT * FROM users WHERE uname='$username' AND pass='$hashed'";

$result= $connect->query($getaccount);

if($result-> num_rows>0) {
    while($row=$result->fetch_assoc()) {
        echo "<br>","Admin name is: " . $row["uname"];
        header("Location: /index.php");
    }
} else {
    echo "<br>","sorry password was incorrect";
}
}

Ответы [ 4 ]

1 голос
/ 21 марта 2020

Редактировать: добавлен новый ответ на основе последних комментариев.

Я отвечу на ваш вопрос в двух частях.

Проверьте, установлена ​​переменная сеанса или нет.

Вы можете проверить, существует ли переменная, используя empty ()

if (empty($_SESSION['is_admin'])) {
    // do the action if the currently logged in user is not an admin
} else {
    // do the action if an admin user is logged in
}

Предупреждение не генерируется, если переменная не существует. Это означает, что empty () по сути является кратким эквивалентом ! Isset ($ var) || $ var == false.

Выполнить проверку входа на всех защищенных страницах.

Рекомендуется добавить проверку входа вверху всех страниц, которые зарезервированы. для зарегистрированных пользователей.

Вы можете добавить проверку входа следующим образом.

Создайте вспомогательную функцию с именем checkLogin()

function checkLogin(){
    if (!empty($_SESSION['user_id'])) {
        return true;
    } else {
        header("Location: https://YOUR_LOGIN_PAGE_URL");
        die();
}

Затем, где бы вы ни хотели ограничить доступ неуполномоченных пользователей к странице, включите эту функцию checkLogin().

Убедитесь, что вы добавили эту функцию в файл, общий для вашего приложения

0 голосов
/ 22 марта 2020

Я изменил ваш код, указанный в вопросе, как показано ниже.

Я заметил некоторые плохие практики в вашем коде и добавил к ним комментарии. Пожалуйста, прочитайте их

<?php
session_start();
$connect= new mysqli('localhost', 'root', '', 'login') or die("connection failure, please try again later");

$username= $_GET["username"] ?? ''; // Username and password should not be passed as a part of the URL. Use POST instead
$password= $_GET["password"] ?? ''; // Username and password should not be passed as a part of the URL. Use POST instead


// Get the details of the user having the given Username
// Make the username field unique so that no two users can have the same username.

$getsalt="SELECT * FROM users WHERE uname='$username' LIMIT 1";
$userRow = $connect->query($getsalt)->fetch_assoc();

// No user found matching username
if (empty($userRow)) {
    // Handle the errors gracefully. Redirect the user back to the login page with an error message, instead of printing an error message.
    // echo "User doesn't exist.";
    // die();
    $_SESSION['loginError'] = "No users found"; 
    header('Location: login.php');
    die();

} else {
    // User found, now check the password

    // HERE YOU CAN AVOID AN UNNECESSARY DATABASE CALL.


    $salt = $userRow['salt'];
    $passwordHash = sha1($password . $salt);
    if ($userRow['pass'] === $passwordHash) {
        // password check succeeded. Let the user logged in
        $_SESSION['uname'] = $userRow['uname'];
        $_SESSION['id'] = $userRow['id'];
        if (!empty($userRow['is_admin'])) {
            $_SESSION['is_admin'] = 1;
        }
        header("Location: /index.php");
    } else {
        // Password check failed. Do not allow the user to logged in
        // Handle the errors gracefully. Redirect the user back to the login page with an error message
        // echo "Incorrect Password";
        // die();
        $_SESSION['loginError'] = "Incorrect Password"; 
        header('Location: login.php');
        die();
    }
}

В вашем login.php добавьте следующий код, чтобы показать сообщение об ошибке

<?php
session_start();
if (!empty($_SESSION['loginError'])) {
?>
<div class="error-message"><?php echo $_SESSION['loginError'];?> </div>
<?php 
unset($_SESSION['loginError'];// we do not need this error message anymore
} 
?>

// Rest of your login page code goes here...

0 голосов
/ 22 марта 2020

Этот вопрос решен, хотя я не знаю, как пометить его как решенный. ключ был в том, что вы должны начинать сеанс на каждой странице с помощью session_start (); благодаря недопустимому боту и Railson luna любой из них теперь будет работать!

0 голосов
/ 21 марта 2020

Вы можете попытаться использовать if(isset($_SESSION['name']) && $_SESSION['name'] )

, этот код проверяет, существует ли переменная и имеет ли значение

...