PHP password_verify возвращает false при извлечении хэшированного PW из базы данных - PullRequest
0 голосов
/ 09 октября 2018

Я исследовал потоки внутри и снаружи SO, но ничего не решило проблему.

Справочная информация: Создание небольшой системы входа в систему с PHP, Wordpress и ACF (расширенные настраиваемые поля).При сохранении сообщения, содержащего пароль, пароль хэшируется, а значение заменяется в базе данных.Пока все хорошо (насколько я могу судить).Когда пользователь заходит на страницу входа в систему, отправляет попытку пароля, php-файл проверки вызывает API-интерфейс Wordpress, извлекает PW с сохраненным хэшем и затем запускает password_verify.Каждый раз, когда он запускается, он возвращает false.Код ниже ...

    $pw_submit = $_POST['pw-submit'];

    //Call WP API
    $urlPrefix = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ?
    'https' : 'http';
    $siteURL = $urlPrefix . "://" . $_SERVER['SERVER_NAME'];
    function callAPI($method, $url, $data){
        $curl = curl_init();
        $url = sprintf("%s?%s", $url, http_build_query($data));

        // OPTIONS:
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: 
            application/json'));
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
        // EXECUTE:
        $result = curl_exec($curl);
        if(!$result){die("Connection Failure");}
            curl_close($curl);
            return $result;
    }

    $get_data = callAPI('GET', $siteURL . '/wp-json/acf/v3/pages/25', false);
    $response = json_decode($get_data, true);
    $db_password = $response[acf][portal_password];        

    if( password_verify( $pw_submit, $db_password) ){
        echo "Well that worked";
    }
    else{
        echo "No it didn't";
    }

Даже если я скопирую / вставлю хешированный пароль и попытаюсь подтвердить, он все равно возвращает ложь ...

    $hash = '$2y$10$2/PuBIYuhEJ69fSc2/ae.OOVr4nMrpKu.9ahRm90TuSBu0EJulWki';
    $verify = password_verify('foobar', $hash);
    var_dump($verify);

... он возвращаетbool (false).

ЕДИНСТВЕННЫЙ способ, когда password_verify когда-либо возвращает true, - это если я создаю хешированный пароль и проверяю его сразу же.Итак, в скрипте проверки ...

    $pw_hash = password_hash('foobar', PASSWORD_DEFAULT);
    $verify = password_verify('foobar', $pw_hash);
    var_dump($verify); // Returns TRUE

Я проверил базу данных и убедился, что ячейка таблицы содержит весь хэш (когда я var_dump извлекаю значение, я получаю строку из 60 символов).Я удостоверился, что нет никаких пробелов до / после с помощью trim ().Я пытался заменить содержащие двойные кавычки, содержащие хеш-строку, одинарными кавычками.Я понятия не имею, что отсутствует / идет не так.Любая помощь / руководство с благодарностью.Спасибо!

ОБНОВЛЕНИЕ Итак, ошибка в том, что я забыл обновить переменную при исправлении предыдущей проблемы.Для тех, кто может наткнуться на это, первоначальная проблема заключалась в том, что Wordpress дважды запускал мой скрипт хэширования, что приводило к хэшированию первого хешированного пароля.Поэтому всегда проверяйте, что на самом деле делает WordPress.Кроме того, одна вещь, с которой я столкнулся, заключалась в использовании ACF get_field () для получения нехэшированного пароля, но поскольку я использовал фильтр wp_insert_post_data (), я фактически получал старое / текущее значение вместо того, чтобы получить новый / вводимый пароль.Исправлено с помощью фильтра 'acf / save_post'.Спасибо всем за помощь!

1 Ответ

0 голосов
/ 09 октября 2018

$db_password = $response[acf][portal_password]; не имеет правильно отформатированных индексов.Вместо этого используйте $db_password = $response['acf']['portal_password'];.

Из-за этой ошибки password_verify($pw_submit, $db_password) проверяет введенный пользователем пароль с переменной $db_password, которая не содержит никакой информации.

...