@zitape

Как закрыть доступ к странице, если пользователь не авторизован?

Есть скрипт обработки данных пользователя для авторизации на сайте:

<?php
session_start();
$conn = mysqli_connect('localhost', 'root', '', 'database') or die ('unable to connect');
    if(isset($_POST['login'])) {
        $username = $_POST['username'];
        $password = $_POST['password'];

        $select = mysqli_query($conn, "SELECT * FROM employers WHERE username='$username' AND password='$password'");
        $row = mysqli_fetch_array($select);

        if(is_array($row)) {
            $_SESSION['username'] = $row['username'];
            $_SESSION['password'] = $row['password'];
        } else
            echo "<script>alert('Неправильный логин или пароль');</script>";
    }
    if(isset($_SESSION["username"])){
        header('location: personal_product.php');
    }
    ?>

Код формы:

<form action="login.php" method="POST">
                <input type="text" class="field" name="username" placeholder="Логин" required=""><br>
                <input type="password" class="field" name="password" placeholder="Пароль" required=""><br>
                <input type="submit" class="form-button" name="login" value="Войти">
            </form>

Также скрипт для выхода:

<?php
    session_start();
    if(session_destroy()) {
        header("location: login.php");
    };
?>

Код рабочий, авторизация проходит, если ввести неправильный логин или пароль появится всплывающее окно об ошибке, после авторизации я оказываюсь на странице personal_product.php и если я нажму выход, снова окажусь на странице авторизации.
Проблема такая, что если я введу в адресную строку personal_product.php мне все равно ее выдаст даже если я не был авторизован. Как можно это исправить, как запрашивать пароль при попытке входа на эту страницу, если я не авторизован или перенаправлять на страницу авторизации, либо вывести надпись типа: "эта страница недоступна для неавторизованных пользователей"?
И ещё таблица с именем и паролем в бд:

64872158e9efb255411718.png
  • Вопрос задан
  • 393 просмотра
Решения вопроса 1
alestro
@alestro
В personal_product.php добавить
isset($_SESSION["username"]) ?: header('location: /login.php');

И как вам указали выше
$select = mysqli_query($conn, "SELECT * FROM employers WHERE username='$username' AND password='$password'");

Ведет к sql-инекции.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@alexalexes
Ну, так основное правило в вебе касаемо кейса "сделать ресурс закрытым от пользователей, у которых нет прав" - это не спрятать ссылки на этот ресурс (в вашем случае дать пользователю редирект). А не давать пользователю получать данные на самом ресурсе, куда ведут ссылки.
То есть, вам нужно чекать авторизацию и набор необходимых прав (если есть разделение на роли, помимо наличия факта авторизации), не только для редиректа, но и на самом ресурсе, куда пользователь может попасть любым путем (на personal_product.php).
PS:
$select = mysqli_query($conn, "SELECT * FROM employers WHERE username='$username' AND password='$password'");

За склейку параметров запроса в виде строки, нужно давать высшую меру наказания и вам, и автору статьи, откуда вы срисовали этот пример. Используйте, подготовленные запросы. Наказание отяжелено еще тем, что в mysqli_* функциях есть весь инструментарий, чтобы сделать запросы безопасными, и не учить никого как это делать иначе.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы