За последние 24 часа нас посетили 52653 программиста и 1764 робота. Сейчас ищут 852 программиста ...

Способы авторизации

Тема в разделе "Прочее", создана пользователем Ensiferum, 26 сен 2010.

  1. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    В инете полно скриптов, реализающих авторизацию (регистрацию + авторизацию) на сайте. И наверняка почти каждый учатсник этого форума делал свои наблоски для авторизации.

    А какая авторизация лучше (в плане защищенности, оптимизации) и т.д.? Никто не сравнивал скрипты или сами алгоритмы авторизации?

    Для начала вот http://habrahabr.ru/blogs/php/13726/
    ЗЫ Похоливарим? :twisted:
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Регистрация должна выглядить как-то так:
    PHP:
    1. <?php
    2. $user = accounts::newOne();
    3. $user->nick = $nick;
    4. $user->email = $email;
    5. ....
    6. $user->save();
    7.  или
    8. accounts::save($user);
    предварительно правильность формы проверена и данные сложены вот в эти $nick, $email и т.п.
    Соответственно потом авторизация
    PHP:
    1. <?
    2. $user = accounts::loadOne(array('nick'=>$nick, 'password'=>$password));
    3. if ($user == false) {
    4.  ошибка
    5. } else {
    6.      $_SESSION['authed'] = $user->id;
    7. }
    в дальнейшем
    PHP:
    1. <?
    2. if (key_exists('authed', $_SESSION)) {
    3.      $user = accounts::loadOne('id'=>$_SESSION['authed']);
    4.      echo 'Привет, '.$user->nick;
    А алгоритм... можно по всякому написать, все равно одно и то же - проверка по регулярке или функции, эскейп, запрос к БД, разбор результата, ответ.
     
  3. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    это скучно, нудно и не итерестно, пишу так что бы работало ...
     
  4. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    [vs]
    PHP:
    1. $auth->check($user, $pass);
    или
    PHP:
    1. $auth->user = $user;
    2. $auth->pass = $pass;
    3. $auth->check();
    ?
     
  5. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Я выкладывал свой способ
    http://www.php.ru/forum/viewtopic.php?t=26841
    Хочу сказать что он достаточно безопасен, прост и в меру гибок...
    (только одна мелочь, пароль лучше не кидать в базу а только его хэш)
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    admyx
    я пришел к выводу, что в отдельном классе auth смысла нет. Достаточно аккаунтов, и свой handler для сессий, если надо пользователей онлайн контролировать.
    А так - конечно первый вариант!
     
  7. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    [vs]
    А как насчет

    PHP:
    1. <?php
    2. class _USER
    3. {
    4. public $authorized = false;
    5.  
    6. public $data = array();
    7.  
    8. public function __construct(); // check authorized user
    9.  
    10. public function register()
    11.  
    12. public function login($user, $pass);
    13. public function logout();
    14.  
    15. public function profile();
    16. }
    Что насчет такой конструкции скажешь?
     
  8. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    у меня с пофигом на низком уровне абстракции делается регистрация и авторизация, в кабинете в начале каждого метода
    стоит $this->checkAuth(); а user будет тупо с ArrayAccess внутри всякие листы, сверху mapper
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    admyx
    Так лучше, но проверка на авторизацию не имеет смысла когда создается новый пользователь. И иногда может потребоваться собрать объект без авторизации, например когда один пользователь редактирует другого. Придется добавлять конструктору параметр
    PHP:
    1. public function __construct((bool)$check_auth);
    а это согласись как-то костыльно
     
  10. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Имеет. Если пользователь авторизован, то он не может зарегистрироваться.

    А вот тогда мы, получается, еще имеем дело с разграничением прав юзверей.
    Это уже интереснее

    Ну а зачем нам еще раз проверять?
    Проще добавить метод edit, или к методу profile добавить параметры profile ($edit = false, $uid = null)
     
  11. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Т.е. если пользователь авторизирован, мы не можем сконструировать новый объект пользователя?
    Есть смысл разграничивать доступ к интерфейсу для выполнения каких-то действий, нет смысла ограничивать в этом программиста.
    Придется делать лишние правила прав пользователей, и это при том что кодер может сделать тупо mysql-запрос.
     
  12. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Эмм.. А зачем?
    У нас есть методы, доступные авторизованноу пользователю..
    А какие он может использовать методы - определяет его группа - уровень доступа.

    Или я не прав где-то?
     
  13. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    а я вообще хотел в сессию писать access и потом по нему с помощью factory создавать юзера или глупая затея?(как это все дальше будет пока не думал)
     
  14. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Ну к примеру в одном смс-сервисе когда приходит смс создается без всякой авторизации объект пользователя, идентифицируясь по номеру телефона, вносятся изменения и сохраняются, пароль меняется.
    Если правами регулировать доступность методов, то менять пароль можно доверить только самому пользователю, и, скажем, администратору. А смс-ресиверу заводить отдельную группу.
    Это лишние усложнения. Угрозу могут представлять только переменные, полученые по HTTP. Если группа не позволяет менять пароль, то и не проверять наличие этого поля, вот и все.
    Больше примеров правда у меня нет)
     
  15. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    [vs]
    Ну тогда, наверное, нужно подгонять класс "под ключ"...
     
  16. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    а кто как выводит ошибки?
     
  17. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Я в сессию сую, после вывода uset
     
  18. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Padaboo
    Ошибки скрипта, или ошибки ввода неправильных данных?

    Лично в ошибках скрипта у меня движок даже нотисы не пропускает и сразу выкидывает kernel panic.
     
  19. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    у меня так получилось сегодня, потом вставляю в основной шаблон то что возвращает функция, ошибку либо пустую строку
    PHP:
    1. <?php    
    2.     private function getError(){
    3.         $errors = array(1 => 'не верный код с картинки',
    4.                          2 => 'имя должно быть от 3 до 20 знаков',
    5.                          3 => 'пароли не совпадают',
    6.                          4 => 'не правильно указан e-mail',
    7.                          5 => 'e-mailы не совпадают',
    8.                          6 => 'пароль должен быть от 4 до 14 знаков',
    9.                          7 => 'такой e-mail уже используется',
    10.                          8 => 'подтвердите регистрацию'
    11.                         );
    12.         $error = '';
    13.         if(isset($_GET['error']) && array_key_exists($_GET['error'], $errors)){
    14.             $error = (int)$_GET['error'];
    15.             $this->registry['view']->setPath('template/auth/error_panel.html');
    16.             $this->registry['view']->setVar('error', $errors[$error]);
    17.             $error = $this->registry['view']->prepare();
    18.         }
    19.         return $error;
    20.     }
    вот думаю как лучше сделать, может так:
    PHP:
    1. <?php
    2.     private function catchError(){
    3.         $errors = array(1 => 'не верный код с картинки',
    4.                          2 => 'имя должно быть от 3 до 20 знаков',
    5.                          3 => 'пароли не совпадают',
    6.                          4 => 'не правильно указан e-mail',
    7.                          5 => 'e-mailы не совпадают',
    8.                          6 => 'пароль должен быть от 4 до 14 знаков',
    9.                          7 => 'такой e-mail уже используется',
    10.                          8 => 'подтвердите регистрацию'
    11.                         );
    12.         $error = '';
    13.         if(isset($_GET['error']) && array_key_exists($_GET['error'], $errors)){
    14.             $error = (int)$_GET['error'];
    15.             $error = $errors[$error];
    16.         }
    17.         return $error;
    18.     }
    19.  
    20.  
    21.     private function getError($error){
    22.         $this->registry['view']->setPath('template/auth/error_panel.html');
    23.         $this->registry['view']->setVar('error', $error);
    24.         return $this->registry['view']->prepare();
    25.     }
    26.  
    тогда такое использование:
    PHP:
    1. <?php
    2.         $error = $this->catchError();
    3.         $error = $this->getError($error);
    с другой стороны можно зайти и в обном месте поменять и ошибки и шаблон
    а может быть сделать как то еше

    admyx
    тоже не люблю нотисы, напрягают они меня ))
     
  20. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    А у меня технология которую надо запатентовать
    HTML:
    1.     <tr>
    2.         <td colspan="2">
    3.         <div style="display: <?=$error_nick?>" class="singup-error">Имя пользователя занято или заполнено неверно:</div>
    4.         </td>
    5.     </tr>
    6.     <tr>
    7.         <td width="170">Имя пользователя:<font color="#FF0000">*</font></td>
    8.         <td><input type="text" name="su[nick]" maxlength="20" value="<?=$val_nick?>" /></td>
    9.         <td><span class="singup-info">Ваше уникальное имя на сервисе. Не более 20 символов, только латинские буквы и цифры.</span></td>
    10.     </tr>
    display или none или block.
     
  21. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    неее я сделаю большую, страшную, красную табличку с ошибкой :D
    пока так error_panel:
    HTML:
    1. <span style="color:red">{error}</span>
    :D
     
  22. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    что то я в замешательстве...
    пишу кусок для восстановления пароля, вводишь свой мыл(он же логин)
    пароль находится в зашифрованном виде, не отправлять же его так на почту
    а если высылать новый, то допустим кто то знает мой мыл, он может менять мне пароль постоянно, он конечно будет приходить новый на почту, но ведь это же никуда не годится
    Может быть секретный вопрос добавить?
     
  23. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Padaboo
    делай чтоб мыло можно было скрывать
     
  24. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Padaboo, закрой эту тему, попробуй восстановить пароль хотя бы на 5 разных сервисах в интернете, и напиши ответ. Правда, такие банальные вещи даже стыдно советовать.
     
  25. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Отправляй некий код(генерируется при отправлении письма, хранится в таблице users), который надо ввести на сайте. Если он введен правильно(совпал с тем, что в базе, по дате(какое-нить поле edit_time в users) не превышает допустим 2 дня или 2 часа) - показываем страничку на которой юзер вводит новый пароль. обновляем в базе.