То, что вы сейчас делаете, - это хэширование пароля (который вы экранировали первым; вы никогда не должны экранировать пароли, поскольку это меняет хеш), затем сопоставьте / проверьте его по значению, которое вы только что хэшировали, без использования хэша из базы данных. - так будет всегда совпадать. Это эквивалентно установке переменной $a = 'foo';
, а затем проверке if ($a == 'foo')
- проверка всегда вернет true.
Вместо этого извлеките хэшированное значение из базы данных на основе имени пользователя и используйте его в качестве второго аргумента для password_hash()
.
Также
- Не сравнивайте с хэшем в базе данных, извлеките его, а затем пропустите через
password_verify()
- Используйте подготовленные операторы (вместо стандартного метода
query()
и использования real_escape_string()
) - см. Как я могу предотвратить внедрение SQL в PHP?
if($_SERVER["REQUEST_METHOD"] == "POST") {
$stmt = $db->prepare("SELECT passhash FROM qa_users WHERE handle = ?");
$stmt->bind_param("s", $_POST['username']);
$stmt->execute();
$stmt->bind_result($hash);
$stmt->fetch();
if (password_verify($_POST['password'], $hash)) {
echo "Valid login";
} else {
echo "Invalid login";
}
$stmt->close();
}