В прошлом я использовал небольшое количество 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);
?>
Вы не используете 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 с подготовленными заявлениями.
Просто используйте библиотеку. Шутки в сторону. Они существуют по причине.
password_hash()
password-compat
(пакет совместимости для вышеНе делай этого сам. Если вы создаете свою собственную соль, ТЫ ДЕЛАЕШЬ ЭТО НЕПРАВИЛЬНО. Вы должны использовать библиотеку, которая обрабатывает это для вас.
$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
}
Других решений пока нет …