Это безопасный способ сделать уровень доступа пользователя с помощью PHP MySQL?

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

if (filter_has_var(INPUT_POST, "signin")){
    $firstname = $_POST["firstname"];
    $password_1 = $_POST["password_1"];

    $sql = "SELECT * FROM users WHERE firstname = :firstname";
    $stmt = $conn->prepare($sql);
    $stmt->execute(["firstname" => $firstname]);
    $res = $stmt->fetch();
    $password = $res["password_1"];

    if (password_verify($password_1, $password)){
        // USER ACCESS LEVEL
        if ($res["user_type"] == "student"){
            $_SESSION["username"] = $firstname;
            header("location: index_s.php?type=student");
        } else if ($res["user_type"] == "teacher"){
            $_SESSION["username"] = $firstname;
            header("location: index_t.php");
        } else {
            $_SESSION["username"] = $firstname;
            header("location: index.php");
        }
    } else {
        array_push($errors, "Invalid username/password entered!");
    }
}

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

не нужно ставить $_SESSION["username"] = $firstname; 3 раза... так же почему бы не проверить пароль в запросе напрямую? (надеюсь, пароль в БД зашифрован, а НЕ MD5)

Book Of Zeus 19.02.2019 06:30

Я думаю, что ваш способ управления доступом на основе ролей достаточно хорош для простой системы. Примечание: почему вы пропускаете type=student, когда вы уже создали отдельную страницу для пользователей-студентов?

user1334621 19.02.2019 06:38
type=student был для тестирования, но я забыл его удалить
Asif 19.02.2019 06:40

Книга Зевса, не могли бы вы написать ответ, как мне написать $_SESSION["username"] = $firstname; только один раз, и пароль зашифрован, и это не MD%'d.

Asif 19.02.2019 06:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
39
1

Ответы 1

Безопасность — огромная тема, и взламывались даже крупные веб-сайты.

При этом я думаю, что ваше решение небезопасно, потому что вы храните простые пароли в базе данных.

Кроме того, вы можете сделать все это в одном запросе. Что-то типа:

$firstname = trim($_POST["firstname"]);
$password  = plain_password_to_hash(trim($_POST["password"])); // Important!

$sql = "SELECT id, user_type FROM users WHERE firstname = :firstname AND password = :password";
$stmt = $conn->prepare($sql);
$stmt->execute(["firstname" => $firstname, "password" => $password]);
$res = $stmt->fetch();

// If $res is empty, the combination of firstname and password wasn't found.

Для защита паролем прочитайте:

  1. https://secure.php.net/manual/en/function.password-hash.php и
  2. https://secure.php.net/manual/en/function.password-verify.php

Другие вопросы по теме