无法登录管理员面板检查管理员或作者

时间:2018-05-08 18:14:22

标签: php mysql web mysqli

我希望有人可以帮助我。我尝试使用admin或writer登录管理面板并阻止示例用户登录,但是当我使用此代码时,我遇到了一些问题:

<?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");
}

此代码允许我只使用admin登录,无法使用writer登录。 当我尝试但是这个('admin'OR'writer')这也让示例用户登录到管理面板,我需要帮助来阻止用户登录到这个页面

谢谢。

3 个答案:

答案 0 :(得分:1)

我认为你错过了一个有条件的部分。 将其添加到您的代码中:

or `role` = 'writer'

所以它应该是这样的:

SELECT * FROM `users` WHERE `user_id` = '$_SESSION[id]' AND `role` = 'admin' OR `role` = 'writer'

答案 1 :(得分:0)

请注意,如果您的第一个条件为真,那么它永远不会在OR语句中检查您的第二个条件。

  

复制并使用它

 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");
        }

答案 2 :(得分:0)

SQL查询的预期代码可能是:

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

重要:您可以(并且应该)通过使用会话ID的预准备语句而不是直接使用该值来改进它。否则,找到设置ID的方法的人可以使用SQL injection以您不期望的方式操作数据库。

现在回到查询:

  • 如果要检查列中的几个可能值,则不能只写 role = 'admin' OR 'writer',但您必须单独检查每个值。这意味着它应该是role = 'admin' OR role = 'writer'。否则,SQL服务器将尝试将'writer'(一个字符串文字)作为布尔值进行评估,而这并不是人们可能认为的那样。相反,它总是如此,基本上使查询无用。
  • 检查多个值的替代方法是IN关键字。它允许role IN ('admin', 'writer')之类的条件,如果角色是“管理员”或“作家”,则属实。
  • 在预定义operator precedence rules之后混合AND和OR,AND比OR强。所以a AND b OR c这样的条件是真的,如果:

    • 满足条件a和b
    • 符合
    • 或条件c。这尤其意味着既不能满足也不能满足b。

    要强制执行优先顺序,请使用括号:a AND (b OR c)

    只有在以下情况下才能满足此条件:

    • 满足条件a且满足条件b
    • 满足条件a且满足条件c
    • 满足条件a并且满足条件b和c。
相关问题