PHP Авторизация на сайте

Правильная php регистрация и авторизация

Опубликовано: 03.02.2015 13:08
Просмотров: 3586

Практически каждому серьёзному сайту требуется авторизация и регистрация пользователя на сайте. Я покажу вам, как сделать это лучше и проще всего.

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

PHP Регистрация

Здесь представлен код, который является только общим примером. Замечу, что для каждого сайта код наверняка нужно будет модифицировать. Я использую фреймворк Codeigniter, так что представленные функции типа $this->input->post() являются специфическими и легко заменяются на аналогичные (Если потребуется - опишу в комментариях, только дайте знать).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//регистрация пользователя
    public function register() {   
        //передаём заголовок для верного распознавания кодировки
        header("Content-Type: text/html; charset=UTF-8");
        // методом post передаём данные со стороны клиента
        $name = $this->input->post('name');
        $secondname = $this->input->post('secondname');
        $surname = $this->input->post('surname');
        $userid = $this->input->post('userid');
        $pass = $this->input->post('pass');
        $email = $this->input->post('email');
        // Генерируем соль
        $salt = '$3h$al$' . substr(str_replace('+', '.', base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(), mt_rand()))), 0, 22) . '$';
        // Шифруем пароль с применением данной соли
        $hashed_pass = crypt($pass, $salt);
        //выполняем запрос к базе данных
        $query_linked = $this->db->query("INSERT INTO `пользователи` (Логин, Пароль, Соль, Имя, Фамилия, E-Mail, ID_Роль) VALUES ('$userid','$hashed_pass','$salt','$name','$secondname','$email','1')");
        //выводим результат TRUE или FALSE
        echo $query_linked;
    }

В данном коде я:

  1. Передаю заголовок
  2. Получаю данные со стороны клиента
  3. Генерирую соль (это некая строка, с помощью которой мы кодируем наш пароль. В случае его воровства грабителям придётся ой как постараться, дабы подобрать пароль доступа). Запомните - Никогда не храните пароли в открытом виде!
  4. Далее с помощью функции crypt шифруем пароль
  5. Выполняем запрос, который вставит определённую запись в таблицу Пользователи. Вы можете переписать этот запрос под свою структуру БД.

PHP Авторизация

Следующий же код тоже очень прост в использовании. Смотрим и оцениваем.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//авторизация пользователя
    public function login() {
        header("Content-Type: text/html; charset=UTF-8");
        $login = $this->input->post('login');
        $pass = $this->input->post('pass');
        // Генерируем соль
        $salt = '$3h$al$' . substr(str_replace('+', '.', base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(), mt_rand()))), 0, 22) . '$';
        // Шифруем пароль с применением данной соли
        $hashed_pass = crypt($pass, $salt);
        $query_check_user = $this->db->query("SELECT пользователи.*,роли.название FROM (пользователи,роли) WHERE пользователи.Логин = " . $this->db->escape($login) . " and пользователи.Пароль = " . $this->db->escape($hashed_pass) . "  and пользователи.ID_Роль = роли.ID"); 
// Если кол-во строк в ответе больше 0         if ($query_check_user->num_rows() > 0) {
//представляем результат в виде массива             $query_check_user = $query_check_user->result_array();
//проходим по всем элементам массива             foreach ($query_check_user as $query_check_user1) {                 // Создаем массим с данными сессии                 $authdata = array(                     'username' => $login,                     'logged_in' => true,                     'familiya' => $query_check_user1['Фамилия'],                     'name' => $query_check_user1['Имя'],                     'name_role' => $query_check_user1['Название']                 );                 // Добавляем данные в сессию                 $this->session->set_userdata($authdata);                 $returnText = '1';             }         } else{             $returnText = '0';         }         echo $returnText;     }

В этой функции мы:

  1. Передаём заголовок (см. выше, если не понимаем)
  2. Получаем Логин и Пароль от клиентской стороны
  3. Генерируем соль
  4. Шифруем введённый пароль с солью
  5. Выбираем пользователей, которые подходят под полученные данные
  6. Если кол-во строк в ответе больше 0, то записываем данные в сессию. В противном случае возвращаем 0, т.е. Неудачу (Fail, FALSE и прочие названия).

Данный способ даёт неплохую защиту данных. Практически нереально будет подобрать пароль + даже при воровстве данных информацию не раскодировать, потому что функция crypt кодирует в одну сторону! Раскодировать невозможно!)))) Так что радуемся, репостим, оставляем отзывы и прочее.

Надеюсь, что статья была вам полезна. Жду ваших комментариев! (P.S. Те, кто найдёт самый большой минус в моём коде - получит 100 баллов на счёт! Поехали!)

 

  • Гость - Станислав

    Разве во время аутентификации соль генерится? Она вроде как должна лежать в БД рядом с хешем засоленного (при регистрации) пароля. Соответственно при авторизации:
    1. берем пароль который ввел пользователь в форме авторизации и склеиваем его с солью из БД
    2. вычисляем хэш полученной склейки
    3. сравниваем с хешем из БД
    4. если хэши совпадают, то предоставляем доступ. Если нет то нет.

Оставьте свой комментарий

Оставить комментарий от имени гостя

0 / 2000 Ограничение символов
Ваш текст должен быть в пределах 10-2000 символов
Ваш комментарий будет отправлен на модерацию