Проблема с логином, я могу войти с любым именем пользователя и паролем - PullRequest
0 голосов
/ 07 февраля 2020

У меня проблема с системой входа в систему Я могу войти в систему с любым именем пользователя и паролем Я не могу исправить

, если кто-то может помочь, я был бы очень признателен

здесь моя система входа в систему

function userLog() {
    global $connect;
    if(isset($_POST['userLog'])) {
        $username = trim(protect($_POST['username']));
        $password = trim(protect($_POST['password']));

        if(empty($username)) {
            $_SESSION['message'] = '';
            header('Location: index.php');
            exit();
        } elseif (empty($password)) {
            $_SESSION['message'] = '';
            header('Location: index.php');
            exit();     
        }
        $userSQL = "SELECT * FROM users WHERE username = :username";
        $userLog = $connect->prepare($userSQL);
        $userLog->bindValue(':username', $username);
        $userLog->execute();
        $userLog->fetchAll();

        #PLACE FOR SELECT DATA FROM SQL TO IMPORT TO SESSION
        $sql = "SELECT * FROM users";
        $stm = $connect->prepare($sql);
        $stm->execute();
        $row = $stm->fetch();
        ####################################################

        if($userLog) {
            $_SESSION['user_id']  = $row['user_id'];#id(mysql)
            $_SESSION['username'] = $row['username'];#user(mysql)
            $_SESSION['email']    = $row['email'];#email(mysql)
            $_SESSION['f_name']   = $row['first_name'];#fname(mysql)
            $_SESSION['l_name']   = $row['last_name'];#lname(mysql)

            header('Location: index.php');
            exit();
        } else {

        }
    }
}

Извините за плохой английский sh

Ответы [ 2 ]

2 голосов
/ 07 февраля 2020

Я не смог go глубоко создать класс! вам нужно проверить наличие классов.

Я просто исправил ваш код настолько, насколько смог, я использовал bindParam вместо bindValue.

Я надеюсь, что вы используете pdo, это показывает, что вы :) Пожалуйста, поместите session_start(); поверх вашей страницы, прежде чем все остальное.

function userLog() {
    global $connect;
    if(isset($_POST['userLog'])) {
        $username = trim($_POST['username']);
        $password = trim($_POST['password']);

        if(empty($username)) {
            $_SESSION['message'] = 'Enter username';
            header('Location: index.php');
            exit();
        } elseif (empty($password)) {
            $_SESSION['message'] = 'Enter password';
            header('Location: index.php');
            exit();     
        }else{
            $sql = "SELECT * FROM users WHERE username = :username";
            if($stmt = $connect->prepare($sql)){
                $stmt->bindParam(':username', $param_username, PDO::PARAM_STR);
                $param_username = $username;
                if($stmt->execute()){
                    $row = $stmt->fetch();
                    if($row['username'] === 1){
                        $hashed_password = $row['password'];
                        $email = $row['email'];
                        $name = $row['f_name'];
                        $lastname = $row['l_name'];
                        $id = intval($row['user_id']);
                        if(password_verify($password, $hashed_password)){
                            session_regenerate_id();
                            $_SESSION["loggedin"] = true;
                            $_SESSION['user_id'] = $id; 
                            $_SESSION['username'] = $username; 
                            $_SESSION['email'] = $email; 
                            $_SESSION['f_name'] = $name; 
                            $_SESSION['l_name'] = $lastname;    

                            header('Location: index.php');
                            exit();                             
                        }else{
                            $_SESSION['message'] = 'wrong password';
                        }
                    }else{
                        $_SESSION['message'] = 'wrong username';
                    }
                }else{
                    $_SESSION['message'] = 'User not found';
                }
            }else{
                $_SESSION['message'] = 'Something went wrong';
            }
        }
    }
}

Я разрешаю вам перенаправлять на страницу с ошибкой

ОБНОВЛЕНИЕ: Это простой пример класса, Поиск правильного способа создания классов.

class userLog {
/** @var object $connect Copy of PDO connection */
private $connect;
/** @var object of the logged in user */
private $user;
/** @var string error msg */
private $msg;

    public function __construct($connect) {
        $this->connect = $connect;
    }  

    public function login($username,$password){
        $stmt = $this->connect->prepare('SELECT * FROM users WHERE username = ? ');
        $stmt->execute([$username]);
        $user = $stmt->fetch();
        if(password_verify($password,$user['password'])){
                $this->user = $user;
                session_regenerate_id();
                $_SESSION['user']['user_id'] = $user['user_id'];
                $_SESSION['user']['fname'] = $user['fname'];
                $_SESSION['user']['lname'] = $user['lname'];
                $_SESSION['user']['email'] = $user['email'];
                return true;
        }else{
            $this->msg = 'Invalid login information';
            //you can change ajax response to session error
            return false;
        } 
    }
}

Использование: $handle = new userLog($connect);

Обратите внимание, что эта функция требует ajax для возврата ответа.

0 голосов
/ 07 февраля 2020

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

$userSQL = "SELECT * FROM users WHERE username = :usr AND password = :pwd";
$userLog = $connect->prepare($userSQL);
$userLog->bindValue(':usr', $username);
$userLog->bindValue(':pwd', $password);
$userLog->execute();
$users = $userLog->fetchAll();

if(count($users) == 0) {
  // fail here, no one to login
  exit();
} elseif(count($users) > 1) {
  // Found more than one user, this should not happen, maybe fail.
}

Если этот проход проходит, пользователь входит в систему и, кроме того, $users[0] держит ваш информация о пользователе

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