За последние 24 часа нас посетили 21637 программистов и 1024 робота. Сейчас ищут 746 программистов ...

Пишем auth lib - сами (или как сохранять статус пользователя)

Тема в разделе "PHP для новичков", создана пользователем glorsh66, 22 июл 2017.

  1. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    хеширование в любом случае убирает возможность оптимизации подбора пароля по времени ответа.
    такая тема возникает только при сравнении чего-то один в один.

    тут такая херня, что надо хранить идентификатор, его в куку и в базу, а к нему в другое поле и в другую куку приписать то, чего сравнивается. Иначе мускул выдаст через изменение времени выборки какая строка сравнивается.

    с идентификатором и другой строкой для сравнения такой фигни не будет.
    мускул будет несекурно выбирать по идентификатору, а потом пхп будет секурно сравнивать.
     
  2. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    PHP:
    1. SQL::P( "DELETE FROM SESSREM WHERE TIMEOUT < {$_SERVER['REQUEST_TIME']}" );
    Redis ?
     
  3. glorsh66

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

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    Немного по некропощу, просто сейчас как раз тестирую что навоял и у меня странные теоретические вопросы возникли -

    Я реализовал следующим образом - что когда юзер заходит генерируется хэш
    PHP:
    1. $random_hash = bin2hex(random_bytes(30));
    И добавляется запись в таблицу - с полями

    Код (Text):
    1. id
    2. session_hash
    3. users_sessions_user_id
    4. users_sessions_timestamp
    соответственно когда - после того как залогинился - то создается сессия и в неё данные храняться
    И авторизация обычном режиме проходит в следующем порядке
    1) проверяем если ли сессия
    2) Проверяем есть ли кука (если есть, то создаем сессию, а хэш куки обновляем) (нужно ли это? Ведь по идеи злоумышленник уже получил доступ и у него просто новая кука появится)


    В принципе такой подход какжется что работает но есть теоритические проблемы..
    1) При каждом заходе (ну естественно есть старая кука удалена) создается новая запись в таблице.
    Я просто зажал f5 и почти тысяча записей☻
    2) Теоритически ведь может совпасть хэш для двух пользоватлей, и кто то окажется не в своих "тапках"☻
    (ну да я понимаю что можно либо проверять на уникальность перед вставкой или просто записать user_id в куку и сверять с ним, что бы знать что хотя бы это тот кто хочет войти в не чужой дядя)

    Правильный ли в целом подход? Или нужно пользователью давать только одну запись (на все устройства и барузеры и тд.)
     
    #28 glorsh66, 18 дек 2017
    Последнее редактирование: 18 дек 2017
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    ответь на вопрос, а что это даёт?
     
    glorsh66 нравится это.
  5. glorsh66

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

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    Вот и я так же думаю) Я точнее в сомнениях)
    Просто хочется самому разобраться как писать грамотно.

    Я вот что хотел больше спросить - безопасно ли для ПОЛЬЗОВАТЕЛЯ - сделать один ключ (хэш)
    Который он будет использоваться - для всех браузеров и устройств
    Т.е. сгенерился для юзера например - 63798%2C11ca6286982339249c220177993a70f5cc7f159
    Мы его добавляем в любую куку когда он зашел с мобилы, другого браузеа и т.д.

    Или нужно делать для кажного "акта" авторизациия (когда стоит галочка remember me) - нужно генерировать новый хэш, сохранять его в базе, и потом в куке.
    Просто тогда прям таблица с хэшами растет на как на дрожжах☺
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    что такое сессия?
     
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    всмысле ?

    для каждого зареганного юзера существует полочка для хеша, когда время подходит и юзает какой - нибудь функционал сайта, где требуется одноразовый токен, полочка обновляется другим хеш кодом. Где дрожжи ? кроме как при регистрации юзеров база данных полнеет. И чо ?
     
  8. glorsh66

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

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    Я вот по этой статье делаю https://paragonie.com/blog/2015/04/secure-authentication-php-with-long-term-persistence
    Особенно по вот этому пункту Proactively Secure Long-Term User Authentication
    Не у меня росло на дрожжках - так как при каждом залогинивании пользователя у меня создавалась новая запись с новым хэшем.

    Я просто вот что не могу в голове у себя уложить - если хэш обновляется в таблице, то он и обновляется в куке?
    Т.е. один пользователь сидит с двух разных браузеров. Он в одном зашел зашел в такое место где требуется авторизация, у него обновился хэш - и получается у того же пользователя на другом браузере - в куках уже не валидный хэ и он как бы выходит?

    Или я где то кардинально не понимаю смысла работы алгоритма?
     
    #33 glorsh66, 19 дек 2017
    Последнее редактирование: 19 дек 2017
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    какую задачу решает хеш?
     
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    хеш не меняется, я же днем с 3 компов сидел
    --- Добавлено ---
    одноразовый токен для форм (CSRF) не относится к хешу аутентификации
    --- Добавлено ---
    https://php.ru/forum/threads/66872/#post-541394
     
  11. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    чей та?
     
  12. glorsh66

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

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    Задача просто оставлять пользователя залогиненым на сайте☻

    Т.е. я правильно понимаю - что мы случайно генерируем значения - его записываем в куку, его же записываем в базу (один и только один, на пользователя) т.е. можно по идеи даже не делать отдельную таблицу а просто записать в поле пользователя?

    И у пользователя будет одна и также кука на всех браузерах и устройствах.
    Ну и соответсвено если поменять его значения - то он как бы выйдет☻ И менять её не нужно?

    А - hash_equals() используется что бы защититься от атаки по времени?
    Т.е. если не учитывать возможность атаки по времени то можно просто хранить слово сгенерированное
    Код (Text):
    1. $random_hash = bin2hex(random_bytes(30));
    И однаждые его сгенерировав никогда не менять?
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    =(
     
  14. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    верно
     
    #39 MouseZver, 20 дек 2017
    Последнее редактирование: 20 дек 2017
  15. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    блоать я такой сейчас бред пишу, таблицу отдельную надо, для каждого браузера, хеш обычно создаю с помощью password_hash
    --- Добавлено ---
    функция не только засаливает необходимые данные для хеша, но и учитывает и вписывает свой овертайм
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    если одно поле на юзера, то меня на одном только устройстве будет запоминать
    я отдельную таблицу завёл
     
    MouseZver нравится это.
  17. glorsh66

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

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    Т.е. правильно понимаю - что на каждый раз когда кто-то входит на сайт (с галочкой remember me) нужно вставлять новую строку в таблицу?

    Вот я про то и говорю - тогда ооочень быстро становить ооочень много записей.
     
  18. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    если нету хеша в куках, то да, а прошедший хеш просрочится и удалится
    --- Добавлено ---
    *в таблице
     
  19. glorsh66

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

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    Всем спаисбо! Разобрался!

    Скоро будет еще одна либа для аунтификации )
     
  20. glorsh66

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

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    Возвращаясь к теме - хотел спросить - по общепринятым стандартам какие допускаются символы для имени пользователя ?

    Ну кроме Банальных
    Код (Text):
    1. /^([a-zA-Z0-9]|\s)+$/

    Разумно ли разрешать пробел? (и я так понял только в середине ника, но не в начале и не в конце)
    И если есть хорошие ссылочки на REGEX с общепринятыми правилами на имя пользователя.

    И по какой странной причине на некоторых сайтах нельзя использовать все специальные символы в пароле? (я частенько такое встречаю, но не понимаю почему? Ведь какая разница если пароль все равно хэшируется и никак не выводится в чистом виде?)
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    нет, если имя пользователя будет юзаться типа как вот так @имя в тексте, и его надо будет вылавливать и раскрашивать.
    да - во всех остальных случаях
    --- Добавлено ---
    потому что гладиолус
     
    glorsh66 нравится это.