【问题标题】:Implementing a check for user levels实施对用户级别的检查
【发布时间】:2019-11-03 08:53:26
【问题描述】:

我正在尝试使用 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>';
  }

【问题讨论】:

  • 将其作为附加子句添加到 WHERE 中。
  • 旁注:这是一个直播网站还是即将上线的网站?我希望不会。
  • 如果我添加附加子句,我如何根据在数据库中找到的内容来确定要包含的 php 文件。例如。如果 isadmin 返回 false,如何将其发送到 index.php,以及如何将 isadmin = true 导航到 admin.php?不,这绝对不会上线
  • 我不明白你在问“要包含哪个 php 文件...”。你到底想在这里做什么?您可能还想同时编辑您的问题,更详细地解释。编辑:什么不起作用或者你想让我们做别的事情吗? @user2519350
  • 切勿以明文形式或使用 MD5/SHA1 存储密码! 仅存储使用 PHP 的 password_hash() 创建的密码哈希,然后您可以使用 password_verify() 进行验证。看看这个帖子:How to use password_hash 并了解更多关于bcrypt & password hashing in PHP

标签: php mysql forms session


【解决方案1】:

一个简单的 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.
}

【讨论】:

    【解决方案2】:

    您的代码中没有对用户输入进行净化,这是登录系统中必须的,请在您的登录表单后尝试。
    信息:我不使用 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 redirect to https://www,您应该为能够成功登录的用户提供安全会话 cookie 或安全持久 cookie。本段下方的代码应位于页面顶部的任何 html 之前。此示例适用于时间相关的持久性 https 安全 cookie,设置为 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 的名称确实应该是随机且唯一的,基于 microtime 的东西会很好用。确保它不是可以识别用户的重要内容!

    重要提示: 供参考的 cookie 名称应在创建帐户时创建并添加到用户表中,以便您可以识别用户并表示他们的登录详细信息。

    标准安全措施还应包括一个单独的表,其中包含登录者的 ip、时间、日期和用户名。如果您的站点繁忙,该表将很快填满,因此您可以设置一个 cron 作业来清理旧记录以保留缩小尺寸,在这种情况下,您需要为 datetime 添加一列来标识记录的年龄。

    正在处理登录...

    <?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的链接如下:How to get the client IP address in PHP

    【讨论】:

      猜你喜欢
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      • 2018-03-15
      相关资源
      最近更新 更多