Я делаю уровень доступа пользователя в 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 в моей пользовательской таблице, в котором пользователь определяет, к какому типу пользователя он относится при регистрации, и на основании этого они перенаправляются на соответствующие страницы при входе в систему. Тем не менее, этот код работает, но я думаю, что это неправильный способ сделать это. Мне нужна ваша помощь и отзывы, чтобы улучшить качество моего кода. Также я новичок в программировании, пожалуйста, объясните четко.
Я думаю, что ваш способ управления доступом на основе ролей достаточно хорош для простой системы. Примечание: почему вы пропускаете type=student, когда вы уже создали отдельную страницу для пользователей-студентов?
type=student был для тестирования, но я забыл его удалить
Книга Зевса, не могли бы вы написать ответ, как мне написать $_SESSION["username"] = $firstname; только один раз, и пароль зашифрован, и это не MD%'d.






Безопасность — огромная тема, и взламывались даже крупные веб-сайты.
При этом я думаю, что ваше решение небезопасно, потому что вы храните простые пароли в базе данных.
Кроме того, вы можете сделать все это в одном запросе. Что-то типа:
$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.
Для защита паролем прочитайте:
не нужно ставить
$_SESSION["username"] = $firstname;3 раза... так же почему бы не проверить пароль в запросе напрямую? (надеюсь, пароль в БД зашифрован, а НЕ MD5)