Регистрация php, пароль mysql, база данных - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь создать регистрационную форму, которая сохранит имя пользователя и пароль в базе данных в 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>

Ответы [ 3 ]

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

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

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

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

Использовать подготовленные операторы

<?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";
}
0 голосов
/ 18 мая 2018

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

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

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

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