PHP password_verify从数据库检索散列的PW时返回False

时间:2018-10-09 16:21:47

标签: php wordpress passwords advanced-custom-fields password-encryption

我已经检查了SO内部和外部的线程,但是没有任何解决方案。

背景:使用PHP,Wordpress和ACF(高级自定义字段)创建小型登录系统。保存包含密码的帖子后,密码将被散列,并在数据库中替换该值。到目前为止一切顺利(据我所知)。当用户访问登录页面,提交密码尝试时,验证php文件将调用Wordpress API,检索存储的哈希值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";
    }

即使我将哈希密码复制/粘贴并尝试验证,它仍然会返回false ...

    $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 :(得分:0)

$db_password = $response[acf][portal_password];没有正确格式化的索引。请改用$db_password = $response['acf']['portal_password'];

由于此错误,password_verify($pw_submit, $db_password)正在验证用户使用变量$db_password输入的密码,该变量不包含任何信息。