PHP password_hash как проверить?

#php

#php

Вопрос:

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

Это код, как я это пробую:

     $gen_pass  =    password_hash("test", PASSWORD_DEFAULT);
    if(isset($_POST["submit_verify"]))
    {
         $pass_verify = filter_var($_POST["pass_verify"], 
         FILTER_SANITIZE_SPECIAL_CHARS);
         if($pass_verify)
         {
             if(password_verify($pass_verify, $gen_pass))
                echo "<h1>SUCCESS</h1>";

             else 
                header("location: ../index");
        }
    else $error_msg     =   "Error!";
}
  

Но когда я пытаюсь это сделать, сайт обновляется, и ничего не происходит.
И когда я ввожу на входе неправильный пароль, тогда я успешно index.php страница.

Комментарии:

1. но расположение индекса в другом состоянии

2. может быть, просто из-за {} просто идея. добавить {} для else

3. @devpro спасибо, это была ошибка… Я помню, что иногда я могу { } удалить его, но сейчас это работает 🙂

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

Ответ №1:

 $options  = [ 'cost' => 12 ];
$gen_pass = password_hash( "test", PASSWORD_BCRYPT, $options );
    if(isset($_POST["submit_verify"]))
    {
         if( password_verify( $_POST[ "submit_verify" ], $gen_pass ) )
         {
                if( password_needs_rehash( 'password_from_database', PASSWORD_BCRYPT, $this->cost ) )
                {
                  $new_hashed_password = password_hash( "new_password", PASSWORD_BCRYPT, $options );
                  // Run and update script to update the password in the database
                }
                echo "<h1>SUCCESS</h1>";
         }
         else 
         {             
                header("location: ../index");
         }
    }
  

Из того, что я могу сказать, использование $pass_verify = filter_var($_POST["pass_verify"], FILTER_SANITIZE_SPECIAL_CHARS); удалит и заменит <> и amp; что произойдет, если пароль содержит эти символы?

Чтобы определить оптимальную стоимость, вы могли бы использовать функцию, подобную этой, возвращаемое число — это значение затрат, которое нужно использовать в течение времени, которое требуется. Измените $min_ms на любую длину, которую вы хотите, и это потребует от вас затрат. Это взято со страницы PHP password_hash.

 function getOptimalBcryptCostParameter($min_ms = 1000) {
    for ($i = 4; $i < 31; $i  ) {
        $options = [ 'cost' => $i ];
        $time_start = microtime(true);
        password_hash("PASSWORD_HERE", PASSWORD_BCRYPT, $options);
        $time_end = microtime(true);
        echo "Time to hash: ".($time_end - $time_start).' with a  cost of '.$i.'<br>';
        if (($time_end - $time_start) * 1000 > $min_ms) {
            return $i;
        }
    }
}
echo getOptimalBcryptCostParameter(); // prints 12 in my case
  

Комментарии:

1. эй, спасибо, что я попробовал это, это тоже работает. У меня есть два метода, первый не забудьте { } и 2. метод, который вы размещаете. Вам тоже спасибо за вашу помощь 🙂

2. Отлично, рад, что ты на ногах.

3. но подождите, я изменил пароль, и теперь я получаю страницу index.php а не текст echo… Что означает «стоимость» и число «12»?

4. Для стоимости начните читать отсюда — php.net/manual/en/password.constants.php . Что касается смены пароля, как вы изменили свой пароль. Вы использовали функцию password_hash() или вручную изменили ее в базе данных на обычный текстовый пароль?

5. Я меняю только в этом случае пароль: «password_hash( «test», PASSWORD_BCRYPT, $options);»