我已经检查了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”过滤器修复了此问题。谢谢大家的帮助!
答案 0 :(得分:0)
$db_password = $response[acf][portal_password];
没有正确格式化的索引。请改用$db_password = $response['acf']['portal_password'];
。
由于此错误,password_verify($pw_submit, $db_password)
正在验证用户使用变量$db_password
输入的密码,该变量不包含任何信息。