我对password_verify没什么问题。 我使用代码点火器3进行研究。
我有用户模型
<?php
class User_model extends CI_Model{
public function __construct()
{
parent::__construct();
$this->load->database();
}
public function createUser($args): int
{
$query = $this->db->insert('user', $args);
return $this->db->affected_rows();
}
public function getUser(string $email): array
{
$query = $this->db->get_where('user',array('email'=> $email));
return $query->row_array();
}
}
用户控制器
<?php
class UserController extends CI_Controller{
public function __construct()
{
parent::__construct();
$this->load->model('user_model');
$this->load->helper('url_helper');
}
public function profile()
{
$data['user'] = $this->user_model->getUser($_POST['email']);
$hash = $data['user']['password'];
if(password_verify($_POST['password'],$hash)){
echo "success";
}else{
echo "failed";
}
$this->load->view('templates/header');
$this->load->view('pages/profileUser',$data);
}
如果我在控制器静态密码中使用它是有效的,如果我通过数据库函数获得哈希密码password_verify不起作用。
感谢您的支持,
正如php.net 所解释的那样password_verify()
验证通过password_hash()
创建的密码。
如果使用 sha256-hash,则可以更好地对用户输入进行哈希处理,并与数据库查询的密码进行比较,如下所示:
$password = $this->input->post('password');
if(hash('sha256', $password) == $hash) {
echo 'success';
} else {
echo 'failed';
}
在我看来,更好的方法是在查询中即时检查密码,如下所示:
$user_query = $this->db->get_where('users', array('email' => $email, 'password' => hash('sha256', $password));
if($user_query->num_rows() == 0) {
print 'failed';
} else {
print 'success';
$user = $user_query->row_array();
...
}
顺便说一句:最好使用CodeIgniters $this->input->post('password'(,因为它会为您进行安全过滤。