Проблема с password_verify при создании пользователей с CodeIgniter - PullRequest
0 голосов
/ 05 декабря 2018

Моя проблема в том, что я использую CodeIgniter.Я создал панель администратора, которую я использую для создания пользователей и паролей.Я использую password_hash перед отправкой их в базу данных (фактически, в базе данных я вижу хешированный пароль).Проблема в том ... Когда я пытаюсь войти, это не так.Я могу получить доступ только с учетной записью администратора, которую я создал до того, как начал использовать CodeIgniter.Я могу войти с учетной записью администратора, но не с учетными записями, созданными с помощью панели администратора.Я попытался использовать очень простой php-файл (вне CI), чтобы скопировать и вставить хэш в одно из полей пользователя в моей базе данных, и это сработало.Я не понимаю, почему это не работает в CodeIgniter.Вот часть моего кода:

public function insert_user($username, $passw, $perm){

  $hashed_pass = password_hash($passw, PASSWORD_DEFAULT);

  $data = array(
    "username" => $username,
    "passw" => $hashed_pass,
    "perms" => $perm
  );

  $this->db->insert('usuarios', $datos);

}

Приведенная выше функция корректно вставляет данные в базу данных.Я вижу, что пароль хэширован, но когда я пытаюсь войти в систему с созданными пользователями из панели администратора, он просто не работает (но работает с учетной записью администратора, и все они используют одну и ту же функцию для входа в систему).

public function login($username, $password){

  $query = $this->db->query("select passw, perms from users where username = '".$username."'");

  $result = $query->row();
  $p_hashed = $result->passw;
  $perms= $result->perms;


  if(password_verify($password, $p_hashed)){
    $info= array(
      "is_valid" => true,
      "username" => $username,
      "perms" => $perms
    );
    return $info;
  }
  else {
    $info= array(
      "is_valid" => false,
      "username" => ""
    );
    return $info;
  }
}

Я проверил базу данных и кодировку CI, все это utf8.Я не понимаю, почему не работает ... Я был бы признателен за любую помощь.

PS: если имя переменных не коррелированы или не совпадают, потому что я перевел его на английский (яне носитель английского языка, поэтому я не использую английский в этом проекте).

Спасибо.

РЕДАКТИРОВАТЬ

Я изменилкод для использования md5 вместо password_hash, и у меня та же проблема.

РЕДАКТИРОВАТЬ 2

Я обнаружил проблему: я сравнивал пароль 2 (первыйодин и подтвердить пароль).После этой комбинации я передал данные в модель ... Но переменная пароля, который я отправлял в модель, была новой переменной без данных.Я хэшировал неинициализированную переменную.

1 Ответ

0 голосов
/ 05 декабря 2018

Кажется, нет никаких проблем в коде, который вы показываете.Как я уже говорил, вероятной проблемой является то, что столбец passw в таблице усекает вставляемые данные.

Проверьте документацию для password_hash , чтобы найти размер возвращаемых данных для различных алгоритмов и соответствующим образом скорректировать структуру таблицы.Для PASSWORD_DEFAULT рекомендуемый размер составляет 255 символов.

Приведенный ниже код не является ответом, но у меня есть время и я подумал, что вам может показаться интересной переработанная версия login().

Предполагается, что вы правильно проверили и санилировали значения, передаваемые методу login().

public function login($username, $password)
{
    //use query binding so values are automatically escaped, producing a safer query
    $query = $this->db->query("select username, perms, passw 
                               from users where username = ?", [$username]);
    // make sure query worked and found a record
    if($query && $query->num_rows() > 0)
    {
        // get an row array so you don't need to make an array
        $row = $query->row_array();
        if(password_verify($password, $row['passw']))
        {
            unset($row['passw']); // remove passw from array
            $row['is_valid'] = true;
            return $row;
        }
    }

    return array( "is_valid" => false,  "username" => "");
}
...