Нужна помощь в чтении / исправлении логина. php с Angular и хешированными паролями - PullRequest
0 голосов
/ 04 августа 2020

Недавно я интегрировал базовую c функцию входа / регистрации на свой веб-сайт и мне нужна помощь в понимании моего кода входа php. Учебник basi c, который я использовал для страницы входа / регистрации, не включал хеширование паролей, которое я сейчас пытаюсь интегрировать. Все работало на 100%, как и ожидалось, пока я не решил добавить хеширование паролей. Я очень новичок в php и в том, как это работает, поэтому я не совсем понимаю, почему мой код не работает, но я понимаю основную c концепцию / рабочий процесс хеширования паролей, ответы на которые можно найти в других вопросах.

Несколько примечаний: регистрация работает нормально, с сохранением хешированных паролей и соединение с базой данных успешно. Также у меня есть служба api, которая вызывает мой логин. php (код включен), что может быть проблемой.

Я протестировал свой SQL запрос SELECT *, password FROM users where email='jim@gmail.com', и он успешно возвращает 1 пользователя со всеми столбцами.

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

Применимый код: логин. php

<?php
include_once("database.php");
$postdata = file_get_contents("php://input");
$request = json_decode($postdata);
if(isset($postdata) && !empty($postdata)){
    $pwd = mysqli_real_escape_string($mysqli, trim($request->password));
    $email = mysqli_real_escape_string($mysqli, trim($request->username));
    $sql = "SELECT *, password FROM users where email='$email'";

    if($result = mysqli_query($mysqli,$sql)){
        $rows = array();
        while($row = mysqli_fetch_assoc($result)){
            $rows[] = $row;
        }
        if(password_verify($pwd, $rows['password'])){
            echo json_encode($rows);
        }
        
    }
    else{
        http_response_code(404);
    }
}
?>

Я пробовал использовать как $ row, так и $ rows в строке password_verify($pwd, $rows['password']) на всякий случай Я не понимаю тип полученного объекта.

Register. php

<?php
include_once("database.php");
$postdata = file_get_contents("php://input");
if(isset($postdata) && !empty($postdata)){
    $request = json_decode($postdata);
    $name = trim($request->name);
    $pwd = mysqli_real_escape_string($mysqli, trim($request->pwd));
    $email = mysqli_real_escape_string($mysqli, trim($request->email));

    $hash = password_hash($pwd, PASSWORD_BCRYPT);

    $sql = "INSERT INTO users(name,password,email) VALUES ('$name','$hash','$email')";
    if ($mysqli->query($sql) === TRUE) {
        $authdata = [
        'name' => $name,
        'pwd' => '',
        'email' => $email,
        'Id' => mysqli_insert_id($mysqli)
    ];
        echo json_encode($authdata);
    }
}
?>

api.service.ts (сокращенно)

public userlogin(username, password) {
        //alert(username)
        return this.httpClient.post<any>(this.baseUrl + '/login.php', { username, password })
        .pipe(map(Users => {
            this.setToken(Users[0].name);
            this.getLoggedInName.emit(true);
        return Users;
        }));
    }

    public userregistration(name,email,pwd) {
        return this.httpClient.post<any>(this.baseUrl + '/register.php', { name,email, pwd })
        .pipe(map(Users => {
        return Users;
        }));
    }

Я не совсем понимаю, как служба api прослушивает выходные данные из входа в систему. php но похоже, что строка echo json_encode($rows); из входа в систему. php - это выход ?? Большое спасибо за любые советы, советы или решения!

1 Ответ

0 голосов
/ 04 августа 2020

Ну, я понял это ... будучи новичком в php, мне было трудно выполнять двойное устранение / отладку. Оказывается, тип данных для $rows вернет null, если я попытаюсь сослаться на $rows['password], но $rows - это правильный тип данных для возврата моего объекта User. Кто-нибудь знает, почему это так?

Мое решение состоит в том, чтобы получить 2 результата и создать один для пароля и один для пользовательского объекта, потому что запуск mysqli_fetch_assoc($result); несколько раз пытается получить следующую строку в наборе результатов. Я не уверен, что это хорошая практика программирования, поэтому не стесняйтесь комментировать свои мысли об этом методе.

ПРИМЕЧАНИЕ: ЭТОТ КОД НЕ ДОКАЗЫВАЕТ SQL ИНЪЕКЦИЮ, НЕ ДОЛЖНО ПРИМЕНЯТЬ БЕЗ ДРУГОГО PDO ЗАЯВЛЕНИЯ. КАК ЗАКАЗАЛИ ДРУГИЕ, ПАРОЛИ НЕ ДОЛЖНЫ БЫТЬ ОБРАБОТАНЫ ПРЯМО ТАК.

логин. php

<?php
include_once("database.php");
$postdata = file_get_contents("php://input");
$request = json_decode($postdata);
    if(isset($postdata) && !empty($postdata)){
        $pwd = mysqli_real_escape_string($mysqli, trim($request->password));
        $email = mysqli_real_escape_string($mysqli, trim($request->username));

        $sql = "SELECT * FROM users where email='$email'";

        if($result = mysqli_query($mysqli,$sql)){
            //$passchk = mysqli_fetch_assoc($result);
            $rows = array();
            while($row = mysqli_fetch_assoc($result)){
               $rows[] = $row;
            }
            if($result2 = mysqli_query($mysqli, $sql)){
                $passchk = mysqli_fetch_assoc($result2);

                if (password_verify($pwd, $passchk['password'])){
                    echo json_encode($rows);   
                }
            }
        }
        else{
            http_response_code(404);
        }
}
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...