не могу войти в админку, проверь если админ или писатель - PullRequest
0 голосов
/ 08 мая 2018

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

<?php
session_start();
include_once("../include/config.php");

if(isset($_SESSION['id'])) {
    $sql = mysqli_query($conn, "SELECT * FROM `users` WHERE `user_id` = '$_SESSION[id]' AND `role` = 'admin' OR 'writer'");
    if(mysqli_num_rows($sql) != 1) {
        header("Location: ../index.php");
    } else {
        echo '';
    }
} else {
    header("Location: ../index.php");
}

Этот код позволяет мне войти в систему только с правами администратора и не может войти с писателем. И когда я пытаюсь, но это («администратор» ИЛИ «писатель»), это также позволяет образцу входа пользователя в панель администратора, мне нужна помощь, чтобы заблокировать вход пользователя на эту страницу

Спасибо.

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Обратите внимание, что если ваше первое условие верно, оно никогда не проверяет ваше второе условие в операторе ИЛИ.

Скопируйте и используйте его

 if(isset($_SESSION['id'])) {
            $sql = mysqli_query($conn, "SELECT * FROM `users` WHERE `user_id` = '$_SESSION[id]' AND `role` = 'admin' OR `role` = 'writer'");
            if(mysqli_num_rows($sql) != 1) {
                header("Location: ../index.php");
            }else {
                echo '';
            }
        }else {
            header("Location: ../index.php");
        }
0 голосов
/ 08 мая 2018

Предполагаемый код для SQL-запроса:

$sql = mysqli_query($conn, "SELECT * FROM `users` WHERE `user_id` = '$_SESSION[id]' AND (`role` = 'admin' OR `role`= 'writer')");

Важно: Вы могли бы (и должны) даже улучшить это, используя подготовленные операторы для идентификатора сеанса вместо непосредственного использования значения. В противном случае тот, кто найдет способ установить идентификатор, может использовать SQL-инъекцию , чтобы манипулировать вашей базой данных так, как вы этого не ожидаете.

Теперь вернемся к запросу:

  • Если вы хотите проверить столбец на наличие нескольких возможных значений, вы не можете просто написать role = 'admin' OR 'writer', но вы должны проверять каждое значение отдельно. Это означает, что это должно быть role = 'admin' OR role = 'writer'. В противном случае SQL-сервер будет пытаться оценить 'writer', строковый литерал, как логическое значение, и это не будет делать то, о чем можно подумать. Вместо этого это всегда так, в основном делает запрос бесполезным.
  • Альтернативой для проверки нескольких значений является ключевое слово IN. Он допускает условия, подобные role IN ('admin', 'writer'), и имеет значение true, если роль имеет значение «admin» или «writer».
  • Смешивание AND и OR следует предопределенным правилам приоритета оператора , и AND сильнее, чем OR. Таким образом, условие типа a AND b OR c выполняется, если:

    • условия a и b выполнены
    • или условие c выполнено. Это особенно означает, что ни a, ни b не должны соблюдаться.

    Для обеспечения приоритета используйте круглые скобки: a AND (b OR c)

    Это условие выполняется только в том случае, если:

    • условие a выполнено и условие b выполнено
    • условие a выполнено и условие c выполнено
    • условие a выполнено, и оба условия b и c выполнены.
0 голосов
/ 08 мая 2018

Я думаю, что вам не хватает части, которая в состоянии. Добавьте это к своему коду:

or `role` = 'writer'

Так и должно быть:

SELECT * FROM `users` WHERE `user_id` = '$_SESSION[id]' AND `role` = 'admin' OR `role` = 'writer'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...