mysqli — проверка пароля PhP crypt не работает

Привет, я только изучаю php, и я начинаю изучать, как сделать вход в систему и сделать их безопасными.
У меня проблема с моим логином в крипте, и я не знаю, как мне проверить, правильный ли это пароль в моей базе данных.
Я сделал это так, что у меня есть криптовый пароль в моей базе данных, но теперь я немного потерян. Я знаю, как проверять соль, но не знаю, где ее разместить в моем коде.

<?php
if(isset($_POST['namn'])) {$username = $_POST['namn'];
$password = $_POST['pass'];if($username&&$password) {$connect = mysqli_connect("localhost", "fredrik", "carlsson") or die("counld not connect");
mysqli_select_db($connect, "securedb") or die("Could not connect to db");

$query = sprintf("SELECT * FROM users WHERE namn = '%s' AND password = '%s'", $username,     $password);

$result = mysqli_query($connect, $query) or die("error connection");if(mysqli_num_rows($result) !==0) {
while($row = mysqli_fetch_assoc($result)) {
$dbusername = $row['namn'];
$dbpassword = $row['password'];}

if($username==$dbusername){if(hash_equals($dbpassword, crypt($password, $dbpassword))) {
header("Location: admin.php");
$_SESSION['name'] = $dbusername;
}
}

}

}

}

?>

Было бы здорово, если бы кто-то мог дать мне несколько советов.

-2

Решение

Я получил проблему, исправив что-то. Я опубликую это, чтобы вы могли видеть, как я сделал это.
Я уверен, что это не правильно во многих отношениях, но я только начал, так что я учусь, хотя …

<?php
if(isset($_POST['namn'])) {$username = $_POST['namn'];
$password = $_POST['pass'];if($username&&$password) {$connect = mysqli_connect("localhost", "fredrik", "carlsson") or die("counld not connect");
mysqli_select_db($connect, "securedb") or die("Could not connect to db");

$query = sprintf("SELECT * FROM users WHERE namn = '%s' ", $username);

$result = mysqli_query($connect, $query) or die("error connection");if(mysqli_num_rows($result)){
$row = mysqli_fetch_array($result);
$dbusername = $row['namn'];
$dbpassword = $row['password'];

if($username==$dbusername && crypt($password, $dbpassword) == $dbpassword) {
$_SESSION['name'] = $dbusername;

header("Location: admin.php");

}

}}}

?>
0

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

Я бы предложил использовать password_hash () а также password_verify () вместо того, чтобы писать свой собственный код. Если у вас есть версия PHP < 5.5.0, есть библиотека совместимости Вот.

Чтобы сгенерировать начальный хеш для хранения в БД: password_hash($password, PASSWORD_DEFAULT);

и проверить пароль с помощью хеша:

if(password_verify($password, $hash) {
header("Location: admin.php");
$_SESSION['name'] = $dbusername;
}

Имейте в виду, что вы не избегаете ввода пользователя и что вам нужно включить сеансы, добавив session_start() Перед использованием $_SESSION,

0

По совету Пола Кровеллы:

<?php
$password = $_POST['pass'];

$ options [‘cost’] = 10;
$ hashed_pwd = password_hash ($ pass, PASSWORD_BCRYPT, $ options);

?>

Это создает ваш хэш пароля, это значение должно быть введено в базу данных при обновлении пароля, затем для проверки пароля вы делаете это:

<?php
$query = "SELECT password FROM users WHERE namn = '%s' LIMIT 1";
$output = mysqli_query($connect, $query);
$cheeckValue = mysqli_fetch_array($output);

Теперь у вас есть пароль, указанный при входе в систему в $ _POST [‘pass’], и у вас есть хэш пароля, сохраненный в базе данных в $ checkValue [‘password’] …

$passLogin = $_POST['pass'];
if(password_verify($passLogin,$checkValue['password'])){

print "Password is correct";
}
else {
print "bad password";
}

Это не решает серьезную проблему внедрения SQL, когда любое значение может быть введено в оператор POST. Первоначально было бы запустить mysql_real_escape_string AS WELL AS string_replace для поиска символов `и ‘и их удаления.

увидеть http://php.net/manual/en/function.password-hash.php

РЕДАКТИРОВАТЬ:
Предотвращение SQL-инъекций
(это достаточно, но, как уже упоминалось, обработка -> prepare () и -> execute () лучше. Пожалуйста, исследуйте.

$bad  = array("%", "_"); //replace these special characters
$good = array("\%", "\_"); //with these escaped versions.
$username = str_ireplace($bad, $good, $_POST['namn']);
$password = str_ireplace($bad, $good, $_POST['pass']);mysqli_set_charset($connect,"utf8");
$username = mysqli_real_escape_string($connect, $username);
$password = mysqli_real_escape_string($connect, $password);
-1