Как использовать password_hash для CodeIgniter - PullRequest
0 голосов
/ 21 мая 2018

Я изучаю CodeIgniter framework и пытаюсь построить систему входа и регистрации.Внизу две функции в контроллерах для входа и регистрации.

Люди предлагают мне использовать "'password' => password_hash($this->input->post('password'), PASSWORD_BCRYPT, $options)," вместо MD5 for password.Я пытался сделать это, но не работает.

Можете ли вы, ребята, помочь мне с этим?Нужно ли что-то менять в моей модели или представлении?Ребята, большое спасибо

Контроллеры: функция входа в систему

if($this->input->post('loginSubmit')){
        $this->form_validation->set_rules('email', 'Email', 'required|valid_email');
        $this->form_validation->set_rules('password', 'password', 'required');
        if ($this->form_validation->run() == true) {
            $con['returnType'] = 'single';
            $con['conditions'] = array(
                'email'=>$this->input->post('email'),
                'password' => md5($this->input->post('password')),
                'status' => '1'
            );

            $checkLogin = $this->user->getRows($con);
            if($checkLogin){
                $this->session->set_userdata('isUserLoggedIn',TRUE);
                $this->session->set_userdata('userId',$checkLogin['id']);
                redirect('users/account');
            }else{
                $data['error_msg'] = 'Wrong email or password, please try again.';
            }
        }
    }

функция регистрации

$data = array();
    $userData = array();

    if($this->input->post('regisSubmit')){
        $this->form_validation->set_rules('name', 'Name', 'required');
        $this->form_validation->set_rules('email', 'Email', 'required|valid_email|callback_email_check');
        $this->form_validation->set_rules('password', 'password', 'required');
        $this->form_validation->set_rules('conf_password', 'confirm password', 'required|matches[password]');

        $userData = array(
            'name' => strip_tags($this->input->post('name')),
            'email' => strip_tags($this->input->post('email')),
            'password' => md5($this->input->post('password')),
            'gender' => $this->input->post('gender'),
            'phone' => strip_tags($this->input->post('phone'))
        );

        if($this->form_validation->run() == true){
            $insert = $this->user->insert($userData);
            if($insert){


                $this->session->set_userdata('email',$userData['email']);
                redirect('email');
            }else{
                $data['error_msg'] = 'Some problems occured, please try again.';
            }

А вот моя функция getRows в моделях.

    function getRows($params = array()){
    $this->db->select('*');
    $this->db->from($this->userTbl);


    //fetch data by conditions
    if(array_key_exists("conditions",$params)){
        foreach ($params['conditions'] as $key => $value) {
            $this->db->where($key,$value);
        }
    }

    if(array_key_exists("id",$params)){
        $this->db->where('id',$params['id']);
        $query = $this->db->get();
        $result = $query->row_array();
    }else{
        //set start and limit
        if(array_key_exists("start",$params) && array_key_exists("limit",$params)){
            $this->db->limit($params['limit'],$params['start']);
        }elseif(!array_key_exists("start",$params) && array_key_exists("limit",$params)){
            $this->db->limit($params['limit']);
        }
        $query = $this->db->get();
        if(array_key_exists("returnType",$params) && $params['returnType'] == 'count'){
            $result = $query->num_rows();
        }elseif(array_key_exists("returnType",$params) && $params['returnType'] == 'single'){
            $result = ($query->num_rows() > 0)?$query->row_array():FALSE;
        }else{
            $result = ($query->num_rows() > 0)?$query->result_array():FALSE;
        }
    }

    //return fetched data
    return $result;
}

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

Надеюсь, это поможет вам:

при регистрации: хеш-пароль при регистрации, например: password_hash

$userData = array(
        'name' => strip_tags($this->input->post('name')),
        'email' => strip_tags($this->input->post('email')),
        'password' => password_hash($this->input->post('password'),PASSWORD_DEFAULT),
        'gender' => $this->input->post('gender'),
        'phone' => strip_tags($this->input->post('phone'))
    );

При входе в систему: проверьте пароль, используя password_verify при входе в систему

/*get the user data based on email or whatever your condition is but exclude password here*/

/* your condition here 
$con['email'] = $email;
$con['status'] = 1; or whatever you set in $con
*/
$checkLogin = $this->user->getRows($con);
if($checkLogin)
{
    if (password_verify($password,$checkLogin['password']))
    {
        $this->session->set_userdata('isUserLoggedIn',TRUE);
        $this->session->set_userdata('userId',$checkLogin['id']);
        redirect('users/account');
    }

}
else
{
     $data['error_msg'] = 'Wrong email or password, please try again.';
}

Метод вашей модели getRows() должен быть таким:

public function getRows($where = array())
{
    if (! empty($where))
    {
       $this->db->where($where);
       $query = $this->db->get('users');
       if ($query->num_rows() > 0)
       {
          return $query->row_array();
       } 
     }
     else
     {
         $query = $this->db->get('users');
         if ($query->num_rows() > 0)
         {
            return $query->result_array();
         } 
     }
}

для получения дополнительной информации: http://php.net/manual/en/function.password-hash.php

0 голосов
/ 21 мая 2018

md5() до password_hash() для лучшего шифрования пароля.

В контроллере регистра:

Изменение:

'password' => md5($this->input->post('password')),

To:

'password' => password_hash($this->input->post('password'),PASSWORD_DEFAULT),

В контроллере входа - удален пароль в качестве условия для $this->user->getRows(..) и впоследствии добавлен password_verify() для проверки входа в систему.

Убедитесь, что $checkLogin['password'] такжевозвращается с $this->user->getRows($con) для password_verify(..) на работу.

Обновленный код:

if($this->input->post('loginSubmit')){
        $this->form_validation->set_rules('email', 'Email', 'required|valid_email');
        $this->form_validation->set_rules('password', 'password', 'required');
        if ($this->form_validation->run() == true) {
            $con['returnType'] = 'single';
            $con['conditions'] = array(
                'email'=>$this->input->post('email'),
                'status' => '1'
            );

            $checkLogin = $this->user->getRows($con); // assumes 'password' field is also returned..
            if(password_verify($this->input->post('password'), $checkLogin['password']){
                $this->session->set_userdata('isUserLoggedIn',TRUE);
                $this->session->set_userdata('userId',$checkLogin['id']);
                redirect('users/account');
            }else{
                $data['error_msg'] = 'Wrong email or password, please try again.';
            }
        }
    }
0 голосов
/ 21 мая 2018

Вы можете сделать это, используя функцию password_hash() в CodeIgniter. password_hash

// create a function custom_password_hash()
private function custom_password_hash($pass){
   return password_hash($pass, PASSWORD_BCRYPT);
}

Теперь вы можете вызывать это из любого места в том же контроллере, как:

$userData = array(
            'name' => strip_tags($this->input->post('name')),
            'email' => strip_tags($this->input->post('email')),
            'password' =>$this->custom_password_hash($this->input->post('password')),
            'gender' => $this->input->post('gender'),
            'phone' => strip_tags($this->input->post('phone'))
        );

Надеюсь, это будет иметь смысл для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...