【问题标题】:PHP password_hash and password_verify weird issue not verifying [closed]PHP password_hash 和 password_verify 奇怪的问题没有验证 [关闭]
【发布时间】:2021-07-26 00:06:17
【问题描述】:

这是我的场景:

我有一个函数可以在调用时发出 json 响应。它在一个包含 Signup.class.php 的类中,其中包含 Signup 类。如上所示,在 gen_hash() 函数中访问 GET 参数 pass 的位置。代码如下。

代码位于https://api1.selfmade.ninja/api/gen_hash?pass=hellooo

        private function gen_hash(){
            if(isset($this->_request['pass'])){
                $s = new Signup("", $this->_request['pass'], "");
                $hash = $s->hashPassword();
                $data = [
                    "hash" => $hash,
                    "info" => password_get_info($hash),
                    "val" => $this->_request['pass'],
                    "verify" => password_verify($this->_request['pass'], $hash),
                    "spot_verify" => password_verify($this->_request['pass'], password_hash($this->_request['pass'], PASSWORD_BCRYPT))
                ];
                $data = $this->json($data);
                $this->response($data,200);
            }
        }

这个函数调用Signup.class.php,代码如下:

<?php

require_once('Database.class.php');

class Signup {

    private $username;
    private $password;
    private $email;

    private $db;

    public function __construct($username, $password, $email){
        $this->db = Database::getConnection();
        $this->username = $username;
        $this->password = $password;
        $this->email = $email;
    }

    public function getInsertID(){

    }

    public function hashPassword(){
        //echo $this->password;
        return password_hash($this->$password, PASSWORD_BCRYPT);
    }

}

问题如下:

  1. gen_hash() 中的“spot_verify”数组键具有可按预期工作的代码。
  2. 但来自gen_hash() 的“验证”数组键的代码未按预期工作。无论情况如何,它总是说假话。哈希是从Signup::hashPassword() 函数生成的。这一切都按预期工作。该值设置正确,并从Signup::hashPassword() 中传递给password_hash 函数。但在“验证”下的 gen_hash() 中,它只是告诉错误。

代码位于https://api1.selfmade.ninja/api/gen_hash?pass=hellooo

它给出了以下答案,没有任何意义。为什么验证是假的?:

{
    "hash": "$2y$10$Y3bq8EzFmEpgM6zZqONeeeP3gaUkSClyjmS3NCWxrpFS6R8okRHJG",
    "info": {
        "algo": "2y",
        "algoName": "bcrypt",
        "options": {
            "cost": 10
        }
    },
    "val": "hellooo",
    "verify": false,
    "spot_verify": true
}

我已经做了什么?我确保将相同的密码值传递给 password_hash 和 password_verify。但这没有任何意义。我错过了什么?

【问题讨论】:

    标签: php password-hash


    【解决方案1】:

    这里多了一个美元符号:

    return password_hash($this->$password, PASSWORD_BCRYPT);
    

    您不小心创建了variable variable。改为这样做:

    return password_hash($this->password, PASSWORD_BCRYPT);
    

    请注意,您的代码应生成直接指向问题的 PHP 警告。所以...不要禁用这些。

    【讨论】:

    • 我的错!谢谢!! :p
    • 我还以为这是一个错字。
    • 无法识别!是的,由于服务器设置,警告被禁用。但是刚刚看到error.log里面的警告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 2022-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多