PHP password_hash 和 password_verify 未验证的奇怪问题
PHP password_hash and password_verify weird issue not verifying
这是我的场景:
我有一个函数可以在被调用时给出 json 响应。它在包含 Signup.class.php 的 class 内部,其中包含 Signup
class。如上所示,在 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);
}
}
问题如下:
gen_hash()
中的“spot_verify”数组键具有按预期工作的代码。
- 但是
gen_hash()
中的“验证”数组键有一个代码没有按预期工作。无论情况如何,它总是说假话。哈希是从 Signup::hashPassword()
函数生成的。一切都按预期工作。该值设置正确,并从 Signup::hashPassword()
中传递给 password_hash
函数。但是在“验证”下的 gen_hash() 中,它只是告诉 false.
代码在 https://api1.selfmade.ninja/api/gen_hash?pass=hellooo
上线
它给出了以下答案,没有任何意义。为什么验证为假?:
{
"hash": "y$Y3bq8EzFmEpgM6zZqONeeeP3gaUkSClyjmS3NCWxrpFS6R8okRHJG",
"info": {
"algo": "2y",
"algoName": "bcrypt",
"options": {
"cost": 10
}
},
"val": "hellooo",
"verify": false,
"spot_verify": true
}
我已经做了什么?我确保将相同的密码值传递给 password_hash 和 password_verify。但这没有意义。我错过了什么?
你在这里多了一个美元符号:
return password_hash($this->$password, PASSWORD_BCRYPT);
你不小心做了一个variable variable。改为这样做:
return password_hash($this->password, PASSWORD_BCRYPT);
请注意,您的代码应该会生成直接指向问题的 PHP 警告。所以...不要禁用它们。
这是我的场景:
我有一个函数可以在被调用时给出 json 响应。它在包含 Signup.class.php 的 class 内部,其中包含 Signup
class。如上所示,在 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);
}
}
问题如下:
gen_hash()
中的“spot_verify”数组键具有按预期工作的代码。- 但是
gen_hash()
中的“验证”数组键有一个代码没有按预期工作。无论情况如何,它总是说假话。哈希是从Signup::hashPassword()
函数生成的。一切都按预期工作。该值设置正确,并从Signup::hashPassword()
中传递给password_hash
函数。但是在“验证”下的 gen_hash() 中,它只是告诉 false.
代码在 https://api1.selfmade.ninja/api/gen_hash?pass=hellooo
上线它给出了以下答案,没有任何意义。为什么验证为假?:
{
"hash": "y$Y3bq8EzFmEpgM6zZqONeeeP3gaUkSClyjmS3NCWxrpFS6R8okRHJG",
"info": {
"algo": "2y",
"algoName": "bcrypt",
"options": {
"cost": 10
}
},
"val": "hellooo",
"verify": false,
"spot_verify": true
}
我已经做了什么?我确保将相同的密码值传递给 password_hash 和 password_verify。但这没有意义。我错过了什么?
你在这里多了一个美元符号:
return password_hash($this->$password, PASSWORD_BCRYPT);
你不小心做了一个variable variable。改为这样做:
return password_hash($this->password, PASSWORD_BCRYPT);
请注意,您的代码应该会生成直接指向问题的 PHP 警告。所以...不要禁用它们。