Многоуровневый вход в систему и сеанс - PullRequest
0 голосов
/ 31 мая 2018

У меня проблема с многоуровневым входом пользователя в PHP MySQL.У меня уже есть код, но пользователь все еще может получить доступ к сайту администратора, в чем проблема с моим кодом?Тем не менее, у меня есть проблемы с сеансами администратора и пользователя ACCT.благодарю вас!вот мой код

require('db.php');
session_start();
if (isset($_POST['username'])){

    $account = stripslashes($_REQUEST['account']); 
    $account = mysqli_real_escape_string($con,$account);

    $username = stripslashes($_REQUEST['username']); // removes backslashes
    $username = mysqli_real_escape_string($con,$username); //escapes special 
    characters in a string

    $password = stripslashes($_REQUEST['password']);
    $password = mysqli_real_escape_string($con,$password);



//Checking is user existing in the database or not
   $query = "SELECT * FROM users_detail WHERE account = '$account',username= 
            '$username' and password= '$password' ";

    $result = mysqli_query($con,$query);
    $rows = mysqli_num_rows($result);

  if($account == "admin" && $rows['username'] = $username && 
   $rows['password']=$password){
        $_SESSION['username'] = $username;

        header("Location: index.php"); // Redirect user to index.php
        }

    if($account == "user" && $rows['username'] = $username && 
      $rows['password']=$password){
        $_SESSION['username'] = $username;

        header("Location: add user.php"); // Redirect user to index.php
        }else{


            echo " <div class='alert'>
                        Username/password is incorrect. Click <a href = 'login.php'>here</a> to log-in.
                </div> ";

        }
}else{
?>`

Ответы [ 5 ]

0 голосов
/ 01 июня 2018

вот полное решение,

1, в вашей пользовательской таблице необходимо создать столбец с именем user_role для каждого пользователя в таблице либо admin, либо normal_user

enter image description here

2 в вашем файле log.php, при первой выборке база данных получает значение user_role, когда вы проверяете пароль пользователя и пароль БД, сохраняете как сеанс.

<?php 

      if( isset($_POST['login_btn'])){  // someone click login btn

    $username = clean($_POST['username']); 
    //clean is the custom function to remove all harmful code
    $password = clean($_POST['password']);


    // run query to get db username & password i am using prepare stmt for more secure , you can use mysqli_fetch_array , but need to implement mysql_real_escape_string for sql injection

    $stmt = mysqli_prepare($connection,"SELECT username,password,email,user_role FROM your table WHERE username = ? ");

    //$connection is your db connection 
    mysqli_stmt_bind_param($stmt, "s", $username);
    mysqli_stmt_execute($stmt);

    mysqli_stmt_bind_result($stmt, $bind_username,$bind_password,$bind_email,$bind_user_role);

    confirm($stmt); // confirm is also custom function to check query is successful execute
    while (mysqli_stmt_fetch($stmt)) {
        $db_username = $bind_username;;
        $db_password = $bind_password ;
        $db_email    = $bind_email ;
        $user_role   = $bind_user_role ;
    }

    //  do form validation           
    if($username =="" or $password =="" ){
        echo 'All Fileds Are Required'; 
    }elseif( $username !== $db_username ){
        echo 'username not existed';
    }else{
    if( password_verify($password, $db_password)){
    // assuming your using password_hash function to verify , or you can just use simply compare $password == db_password                                           
    // if password_verify return true meaning correct password then save all necessary sessions
    $_SESSION['username']         = $db_username ;
    $_SESSION['user_email']       = $db_email ;
    $_SESSION['user_role']        = $user_role ;

    // first method ->    header('Location: portal.php');      
    // you can now direct to portal page{1st method } where all admin or normal user can view 
    // or you can now do separate redirection (2nd method below )
    // remember $user_role  will == 'admin' or 'normal_user'
if( $user_role == 'admin' ){
    header('Location: page_admin_will_view.php');
}elseif(  $user_role == 'normal_user'  ){
    header('Location: page_normal_user_will_view.php');
}

    }else{
       echo 'incorrect password';
    }

 }                                  
    }  //  end of post request 

?>

3 как насчет того, чтобы обычный пользователь случайно зашел на страницу администратора?мы должны это рассмотреть и выполнить некоторую дополнительную работу, поместив приведенный ниже код в заголовок page_admin_will_view.php

<?php 
    if( isset($_SESSION['user_role'] )){ 
    // meaning user is logged in 
        if(  $_SESSION['user_role']  !== 'admin'){
        // meaning user_role is not amind , redirect to the page normal user belongs to
         header("Location: ../normal_users.php");
    }

    } else{
        //redirect to somewhere meaning user is not logged in
         header("Location: ../somewhere.php");
    }

?>

Надеюсь, это поможет вам, и я его использую, возможно, это не идеальное решение.,но это работает для меня.ха

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

Похоже, вы пытаетесь реализовать контроль доступа на основе ролей на своем веб-сайте.

Вот возможная реализация с использованием подготовленных операторов:

<?php

// db.php should create a mysqli insance:
// $con = new mysqli("host", "username", "password", "databaseName"); 
require('db.php');
session_start();

if (isset($_POST['username']) && isset($_POST['password'])) {

    //Checking is user existing in the database or not
    $query = "SELECT * FROM users_detail WHERE username = ? and password = ?";

    //use prepared statement
    $stmt = $con->prepare($query);
    $stmt->bind_param('ss', $_POST['username'], $_POST['password']);
    $stmt->execute();
    $result = $stmt->get_result();

    if ($result->num_rows !== 0) {

        //fetch user from database.
        $user = $result->fetch_assoc();

        //check if user is an admin.
        if($user['account'] === "admin") {
            $_SESSION['username'] = $username;
            header("Location: admin.php"); //admin's page
        }

        //check if user is a normal user.
        if($user['account'] === "user") {
            $_SESSION['username'] = $username;
            header("Location: user.php"); //user's page
        }

    } else {
        echo '<div class="alert">Username/password is incorrect. Click <a href="login.php">here</a> to log-in.</div>';
    }
    //free memory used by the prepared statement.
    $stmt->close();
} else { 
    //username and password not provided.
}
?>
0 голосов
/ 31 мая 2018

То, о чем вы говорите, - это RBAC (управление доступом на основе ролей).

if($account == "admin" && $rows['username'] = $username && $rows['password']=$password){
    $_SESSION['username'] = $username;
    $_SESSION['access'] = $account;
}

А на ваших страницах, где вы хотите получить доступ администратора, возможно, вам следует либо перенаправить пользователя на дом, либо отправить сообщение о несанкционированном доступе.

if(isset($_SESSION['access']) && $_SESSION['access'] != 'admin') {
    header("Location: index.php");
}

Также, если вы ищетебольше контроля в зависимости от роли, я предлагаю вам использовать библиотеку, как http://phprbac.net/

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

Прежде всего, создайте роль администратора, как вы сделали с $ account, когда пользователь входит в систему, сохраните его admin_role в сеансе,

$admin_user = $_SESSION['admin_user'] ;
$normal_user = $_SESSION['normal_user'] ;

на сайте администратора, например, admin.php, страница, которую вы не хотите нормальнопользовательский вид напишите это {отлично напишите это в header.php}

if(isset($_SESSION['username'])){  
//meaning user is logged in
    if(isset($_SESSION['admin_user']) or isset($_SESSION['normal_user'])){

        if( $_SESSION['admin_user'] !== 'admin_user' ){
            header('Location: somewhere.php');

        }
    }
}else{
   //meaning user is not logged or session had terminated 
   header('Location: index.php');
}
0 голосов
/ 31 мая 2018

mysqli_num_rows($result) возвращает количество строк.Поэтому после $result = mysqli_query($con,$query); вам нужно записать данные выборки, используя mysqli_fetch_array($query)

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