Php 使用codeigniter中的用户输入验证数据库中的哈希密码
您好,过去几天我一直在努力解决登录时用户输入密码验证部分的问题。首先提到,我使用codeigniter的外部库对密码进行散列。问题是,当我从数据库获取哈希密码并使用一个库函数将用户的原始密码输入与从数据库返回的密码输入进行比较时,它返回false。我想我已经尝试并检查了每一个可能出现错误的地方,但我找不到答案。我甚至检查了字符串的长度是否是问题所在,我还尝试更改长度、类型(varchar,char)甚至phpmyadmin中密码字段的排序规则,但仍然没有结果。在我的尝试中,我认为我发现的codeigniter库可能有问题,所以我决定使用brcypt的原生php函数来确定。但在比较两个密码(散列和原始输入)时也存在同样的问题。我还尝试硬编码密码,然后对其进行散列,然后将原始密码与散列密码与php verify函数进行比较,令人惊讶的是,它返回了true。因此,我很困惑到底出了什么问题,与数据库中的散列密码相比,它返回false,但与经过散列和比较的密码相比,即时返回true。这两个函数(codeigniter库和本机php函数)都可以很好地使用散列和即时比较的方法。顺便提一下,我的php版本是5.6.10,我正处于绝境,没有想法,所以任何帮助都将受到感谢 一切都是为了测试的目的,所以我提供的是测试,如果它工作。我的代码是相似的 检索哈希密码并将其返回控制器以便与硬编码密码(与寄存器上提供的密码相同)进行比较的测试模型。请忽略这些评论Php 使用codeigniter中的用户输入验证数据库中的哈希密码,php,mysql,codeigniter,hash,Php,Mysql,Codeigniter,Hash,您好,过去几天我一直在努力解决登录时用户输入密码验证部分的问题。首先提到,我使用codeigniter的外部库对密码进行散列。问题是,当我从数据库获取哈希密码并使用一个库函数将用户的原始密码输入与从数据库返回的密码输入进行比较时,它返回false。我想我已经尝试并检查了每一个可能出现错误的地方,但我找不到答案。我甚至检查了字符串的长度是否是问题所在,我还尝试更改长度、类型(varchar,char)甚至phpmyadmin中密码字段的排序规则,但仍然没有结果。在我的尝试中,我认为我发现的code
public function login_user($email){
//Validate
$this->db->where('email',$email);
//$this->db->where('password',$enc_password);
$result = $this->db->get('users');
if($result->num_rows() == 1){
$row = $result->row();
}
return $row->password;
} else {
return false;
}
}
测试控制器
public function login()
{
$this->load->model('test_model');
$email = "minas@live.com";
$password = '12345';
$test1 = $this->test_model->login_user($email,$password);
//$options = [
//'cost' => 10,
//];
//$hash_password = password_hash($password, PASSWORD_BCRYPT, $options);
if(password_verify($password, $test1)){
$query_data['test']="it works";
}else{
$query_data['test']="not works";
}
//$this->load->view('templates/header');
$this->load->view('view_test2',$query_data);
//$this->load->view('templates/footer_movie_list_full');
我创建用户时的哈希
public function create_member(){
$password = $this->input->post('password');
$options = [
'cost' => 10
];
$hash_password = password_hash($password, PASSWORD_BCRYPT, $options);
$new_member_insert = array(
'firstname' => $this->input->post('user_firstname'),
'lastname' => $this->input->post('user_lastname'),
'email' => $this->input->post('user_email'),
'password' => $hash_password
);
$insert = $this->db->insert('users', $new_member_insert);
return $insert;
}
}
对于验证,我使用codeigniter的set rules函数,该函数在我在数据库中使用的帖子出现之前执行。
请帮帮我,因为我不知道还能做什么。你确定你在使用你提到的github库吗?您的
password\u hash()
和password\u verify()
函数在我看来就像是内置的PHP函数。你的密码栏有多大?它至少需要容纳60个字符。在返回$row->password之前,您有足够的右括号
。您做得不错,但必须从以下位置删除}
:$row=$result->row();}返回$row->密码
因为密码永远不会返回。@OllieJones这是本机php函数的第二种方法,因为我说过我已经在库中尝试过了,并且认为库是问题所在,所以我决定使用本机php函数。我的专栏很大。我知道有输入错误,但我不认为这是比较或验证功能不起作用的原因。正如其他人指出的vurly大括号,这显然是一个问题。但是对我来说,我想知道你是否提供了你正在运行的确切代码。这是因为当您的else语句挂起在您的login\u用户函数中时,这段代码应该会产生一个php错误。