password_verify возвращает true - PullRequest
1 голос
/ 10 июля 2019

Я хочу сравнить свой пароль и мой хэш-пароль с password_verify(), но всегда возвращает true. Почему это происходит?

Вот код:

if($_SERVER["REQUEST_METHOD"] == "POST") {
    // username and password sent from form 

    $myusername = mysqli_real_escape_string($db,$_POST['username']);
    $mypassword = mysqli_real_escape_string($db,$_POST['password']); 
    $hash = password_hash($mypassword, PASSWORD_DEFAULT);

    $ourdb = "SELECT handle FROM qa_users WHERE handle = '$myusername' and passhash = '$mypassword'";
    $ourresult = mysqli_query($db,$ourdb);
    $ourrow = mysqli_fetch_array($ourresult,MYSQLI_ASSOC);
    $ouractive = $ourrow['active'];
    $ourcount = mysqli_num_rows($ourresult);

    if(password_verify($mypassword, $hash)){
        echo "hashed";
    }

1 Ответ

7 голосов
/ 10 июля 2019

То, что вы сейчас делаете, - это хэширование пароля (который вы экранировали первым; вы никогда не должны экранировать пароли, поскольку это меняет хеш), затем сопоставьте / проверьте его по значению, которое вы только что хэшировали, без использования хэша из базы данных. - так будет всегда совпадать. Это эквивалентно установке переменной $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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...