Реализация проверки для пользовательских уровней - PullRequest
0 голосов
/ 03 ноября 2019

Я пытался создать систему аутентификации при входе в систему с использованием PHP. До сих пор мне удавалось сделать запрос к БД, чтобы проверить, соответствуют ли имя пользователя / пароль, данное пользователем, каким-либо строкам в БД. Однако у меня есть столбец в БД с именем «isadmin», который хранит логическое значение. Я хочу реализовать проверку, если истина / ложь. В зависимости от результата зависит, какой файл php загружен (включен).

РЕДАКТИРОВАТЬ: у меня есть два файла php, каждый из которых содержит один и тот же HTML, отображающий страницу индекса веб-сайта. Однако один php-файл предназначен для обычных пользователей, а другой - для администраторов, которые будут содержать дополнительные функции. Когда пользователь вводит свое имя пользователя и пароль, я хочу проверить уровень пользователя для этого имени входа. После завершения проверки должна отобразиться соответствующая страница php.

$stmt = $pdo->prepare('SELECT * FROM Reg_User WHERE username = :username AND password = :password');
$details = [
 'username' => $_POST['username'],
 'password' => sha1($_POST['password'])
];
unset($_POST['submit']);
$stmt->execute($details);
if ($stmt->rowCount() > 0) {
    $user = $stmt->fetch();
    $_SESSION['loggedin'] = $user['user_id'];
    echo 'Logged in as ' . $_POST['username'];
    include 'index.php';
   }
   else {
    echo 'Sorry, your username and password could not be found Please <a href="login.html">try again 
    or register!</a>';
  }

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Простой оператор if / else сделает это.

if ($user["isadmin"]) {
    echo "Logged in as an admin.";
    #you can include your related php page here.
} else {
    echo "Logged in as an user.";
    #you can include your related php page here.
}
0 голосов
/ 03 ноября 2019

В вашем коде нет дезинфекции пользовательского ввода, это необходимо в системе входа в систему, попробуйте это после формы входа в систему. info: Я не использую PDO, $ con - это соединение MYSQLI.

<?php
// Handle log in
if (isset($_POST['login'])) {
$username = $_POST['username'];
$password = $_POST['password'];

// Sanitize username input
$username = strip_tags($username);
$username = trim($username);
$username = mysqli_real_escape_string($con, $username);
$username = urldecode($username);

// Sanitize password input
$password = strip_tags($password);
$password = trim($password);
$password = mysqli_real_escape_string($con, $password);
$password = urldecode($password);
}
?>

Ваш сайт должен быть настроен только на https, если игнорируется эта ссылка: htaccess перенаправляет на https://www, и вы должны предоставить либо безопасный сеансовый файл cookie, либо безопасный постоянный файл cookie для пользователей, которые могут успешно войти в систему. Код под этим абзацем должен быть в самом верху вашей страницы перед любым HTML. Этот пример относится к постоянному защищенному файлу https, связанному со временем, установленному в 1 день, после которого он истекаетВы можете использовать cookie-файлы сеанса, но я нахожу, что это раздражает людей, если они часто посещают ваш сайт, им не нужно повторять вход в тот же день, если они закрывают и снова открывают браузер или вкладку.

<?php
// All this code goes right at the top of your page before anything else!
function addcookie() {
global $condition;
if ($condition == "green") {
global $nameofcookie;
setrawcookie('loggedin', $nameofcookie, strtotime('+1 day'), '/', '', isset($_SERVER["HTTPS"]), true);
echo "<script>window.location.replace('https://example.com/mypage');</script>";
}
}
?>

Приведенный выше код установит безопасный cookie-файл с помощью функции, поскольку вы хотите, чтобы он запускался только после успешного входа в систему. Название куки действительно должно быть случайным и уникальным, что-то, основанное на микротайме, будет работать хорошо. Убедитесь, что это не что-то важное, что может идентифицировать пользователя! ВАЖНО: имя файла cookie для справки должно быть создано во время создания учетной записи и добавлено в таблицу пользователей, чтобы вы могли идентифицировать пользователей и представлять их учетные данные.

Стандартные меры безопасноститакже должна включать в себя отдельную таблицу ip, времени, даты и имени пользователя, который вошел в систему. Если ваш сайт занят, таблица заполняется быстро, поэтому вы можете настроить задание cron для очистки старых записей, чтобы уменьшить размер, в этом случаевам нужно будет добавить столбец для даты и времени, чтобы определить возраст записей.

Обработка входа в систему ...

<?php
$condition = "red";
if (isset($_POST['login'])) {
$select_login = "select * from Reg_User where username='$username' and password='$password'";
$connect_login = mysqli_query($con, $select_login);
$rows_login = mysqli_num_rows($connect_login);
if ($rows_login == 0) {
// code here to handle failed logins, I would record them and use a 3 strike method
}

// Handle successful logins, add cookie
else {
while ($row_login=mysqli_fetch_array($connect_login)) {
// Retrieve cookie name here from table
$nameofcookie=$row_login['cookie'];
$condition = "green"; // This allows you to add the cookie
addcookie();
}
}
}
?>

Получение cookie для аутентификации пользователей ...

<?php
if (isset($_COOKIE['loggedin'])) {
$cookie = $_COOKIE['loggedin'];
$select_authenticated_user = "select * from Reg_User where cookie='$cookie'";
$connect_authenticated_user = mysqli_query($con, $select_authenticated_user);
while ($row_authenticated_user=mysqli_fetch_array($connect_authenticated_user)) {
// Retrieve values here from table
$logged_in_user=$row_authenticated_user['username'];
$logged_in_admin=$row_authenticated_user['isadmin'];
// Resolve admin status
if ($logged_in_admin == TRUE) {
$type = "admin";
} else {
$type = "member";    
}
}
// Echo statement for logged in user with admin or not status, you could change the echo to a variable name if you want to use this in a specific place on your page.
echo "Welcome $logged_in_user<br/>
Type: $type
";
}
?>

Вот ссылка для получения IP-адресов: Как получить IP-адрес клиента в PHP

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...