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






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