Нулевые значения вводятся в БД при попытке хэширования паролей

В прошлом я использовал небольшое количество PHP для проектов, но я пытаюсь что-то новое, пытаясь хэшировать пароли.

На отдельной странице есть веб-форма, которая перенаправляет при отправке в форму checkRegistration.php, которая затем подключается к базе данных, принимает значения пользователей, проверяет их и вводит их в соответствующие столбцы.

Пока что все передаваемые значения вводятся правильно, кроме тех, которые передаются функцией password_hash, которые вводятся как «0» или пустые. Я думаю, что это 0, это не обрабатывается правильно, и мне было интересно, что я делаю неправильно.

<?php
$con = mysqli_connect("127.0.0.1","root","","projectdatabase");if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$password_user_input = $_POST['password'];
$options = array('cost' => 10);$sql="INSERT INTO user_information (firstName, lastName, userName, password, email, contactNum)
VALUES
('$_POST[firstname]','$_POST[lastname]','$_POST[uname]','password_hash($password_user_input, PASSWORD_BCRYPT, $options)','$_POST[email]','$_POST[number]')";

if (!mysqli_query($con,$sql))
{
die('Error: ' . mysqli_error($con));
}
header("location:login.php");

mysqli_close($con);

?>

2

Решение

Вы не используете password_hash() функционировать правильно, и вы не можете передать функцию в ваших ЗНАЧЕНИЯХ.

Вы бы получили или должны были получить сообщение о том, что это неопределенная функция, или столбец пароля будет содержать password_hash(hashed_password_string, PASSWORD_BCRYPT, Array) как строка Это два результата, которые я получил при тестировании.

Вот что тебе нужно сделать.

Вам необходимо предварительно определить переменную и передать ее функции.

$password_user_input = $_POST['password'];
$options = array('cost' => 10);

$pass = password_hash($password_user_input, PASSWORD_BCRYPT, $options);

$sql="INSERT INTO user_information (firstName, lastName, userName, password, email, contactNum)
VALUES
('$_POST[firstname]','$_POST[lastname]','$_POST[uname]','$pass','$_POST[email]','$_POST[number]')";

Однако использование этого метода оставляет вас открытым для SQL-инъекция.

использование готовые заявления, или же PDO с подготовленными заявлениями, они намного безопаснее.


Вот метод, извлеченный из ответа ircmaxell https://stackoverflow.com/a/29778421/ используя PDO с подготовленными заявлениями.

Просто используйте библиотеку. Шутки в сторону. Они существуют по причине.

  • PHP 5.5+: использовать password_hash()
  • PHP 5.3.7+: использовать password-compat (пакет совместимости для выше
  • Все остальные: использовать phpass

Не делай этого сам. Если вы создаете свою собственную соль, ТЫ ДЕЛАЕШЬ ЭТО НЕПРАВИЛЬНО. Вы должны использовать библиотеку, которая обрабатывает это для вас.

$dbh = new PDO(...);

$username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];
$hash = password_hash($password, PASSWORD_DEFAULT);

$stmt = $dbh->prepare("insert into users set username=?, email=?, password=?");
$stmt->execute([$username, $email, $hash]);

И при входе в систему:

$sql = "SELECT * FROM users WHERE username = ?";
$stmt = $dbh->prepare($sql);
$result = $stmt->execute([$_POST['username']]);
$users = $result->fetchAll();
if (isset($users[0]) {
if (password_verify($_POST['password'], $users[0]->password) {
// valid login
} else {
// invalid password
}
} else {
// invalid username
}
6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]