Регистрация php, пароль mysql, база данных

Я пытаюсь создать регистрационную форму, которая сохранит имя пользователя и пароль в базе данных в phpmyadmin.

Проблема в том, что имя пользователя сохраняется, а пароль - нет. Я имею в виду, когда я регистрируюсь с паролем «12345» и когда я иду в базу данных, мой пароль не сохраняется как «12345», вместо этого он сохраняется как «96991368fec63c8a1bfc48a70010f84a» или другие случайные числа ... В базе данных я поставил Char (40) в качестве пароля.

это мой код:

<?php
session_start();
$db=mysqli_connect("localhost","root","","register");

if (isset($_POST['register'])){
session_start();

$username=mysqli_real_escape_string($db,$_POST['username']);
$email=mysqli_real_escape_string($db,$_POST['email']);
$password=mysqli_real_escape_string($db,$_POST['password']);

    $password =md5($password);
    $sql = "INSERT INTO users(username,email,password) 
    VALUES('$username', '$email', '$password')";
    mysqli_query($db, $sql);
    $_SESSION['message'] = " You are now logged in";
    $_SESSION['username'] = $username;
    header("location: Login.php");
}
?>

А это форма:

form method = "post"  action = "Registration.php">
    <table>
        <tr>
            <td>Username:</td>
            <td><input type = "text" name = "username" class = "textInput"></td>
        </tr>

        <tr>
            <td>Email:</td>
            <td><input type = "email" name = "email" class = "textInput"></td>
        </tr>

        <tr>
            <td>Password:</td>
            <td><input type = "password" name = "password" class = "textInput"></td>
        </tr>

        <tr>
            <td></td>
            <td><input type = "submit" name = "register"Value = "Register"></td>
        </tr>
    </table>
</form>

Как сказал Delete, используйте подготовленные операторы при взаимодействии с вашей базой данных. Они защищают от SQL-инъекций. Как сказал zaph, вы сохраняете хеш пароля и проверяете его. У PHP есть собственные функции для этого. Изучите различные алгоритмы. И, как сказал Jim Kyle, вы храните хешированный пароль - однако НЕ используйте для этого MD5. Он известен своей слабостью и легко взламывается.

TomJ 18.05.2018 22:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
489
3

Ответы 3

Не сохраняйте пароль, сохраните хеш пароля. При использовании PHP самый простой подход - использовать password_hash и password_verify, пара безопасна и проста в использовании.

Это делает пароль защищенным от злоумышленников и позволяет легко проверить пароль при входе пользователя в систему.

Подробнее:
При сохранении верификатора пароля простого использования хеш-функции недостаточно, и простое добавление соли мало способствует повышению безопасности. Вместо этого используйте такие функции, как PBKDF2, Rfc2898DeriveBytes, Argon2, password_hash, Bcrypt или аналогичные функции с таким счетчиком итераций, что потребляется ~ 100 мс или время процессора. Смысл в том, чтобы заставить злоумышленника тратить много времени на поиск паролей с помощью грубой силы.

Ваш вызов функции md5 в строке 12 вашего опубликованного кода преобразует ввод пароля пользователя в виде открытого текста в хеш-строку, на которую вы жалуетесь. Ответ Зафа совершенно правильный; если вы храните пароль в виде открытого текста, любой злоумышленник получит к нему легкий доступ, что является настолько небезопасным, насколько это возможно.

Другими словами, похоже, что ваш код делает именно то, что вы ему говорите, даже если это не то, что вы планировали или ожидали.

Используйте подготовленные заявления

<?php
$host = 'localhost';
$user = 'root';
$pass = '';
$db = 'register';

try {
    $db_conn = new mysqli("$host", "$user", "$pass", "$db");
    $db_conn->set_charset("utf8");
} catch (Exception $e) {
    echo "Connection failed: " . $e->getMessage();
}

if (isset($_POST['register'])) {
    session_start();

    $username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
    $email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_STRING);
    $password = filter_input(INPUT_POST, 'password', FILTER_SANITIZE_STRING);


    $password = password_hash($password, PASSWORD_BCRYPT);
    $query = $db_conn->prepare("INSERT INTO users(username,email,password)VALUES(?,?,?)");
    $query->bind_param('sss', $username, $email, $password);
    $query->execute();
    $counts = $query->num_rows;
    $query->close();

    if ($counts > 0) {
        $_SESSION['message'] = " You are now logged in";
        $_SESSION['username'] = $username;
        header("location: Login.php"); 
    } else {
        echo 'registration failed... Something went wrong';
    }
}
?>

Конец, когда пользователь пытается войти, сделайте это

$query = $db_conn->prepare("select password from users where username = ? limit 1");
$query->bind_param('s', $username);
$query->bind_result($dbpassword);
$query->execute();
$query->store_result();
$query->fetch();
$query->close();

if (password_verify($password, $dbpassword)) { 
     echo "login success";
} else {
     echo "wrong password";
}

cont: password_hash использовал уникальную (случайную) соль, поэтому два пароля не будут хешировать один и тот же результат. Разрешение хеширования идентичных паролей для получения одного и того же результата открывает доступ ко всем учетным записям, использующим один и тот же пароль, если известно, что одна из них подверглась грубой форсировке. См. password_hash и password_verify, пара безопасна и проста в использовании.

zaph 19.05.2018 09:53

Другие вопросы по теме