За последние 24 часа нас посетили 108011 программистов и 5606 роботов. Сейчас ищут 2778 программистов ...

Аутентификация через сессии.

Тема в разделе "PHP для новичков", создана пользователем alex-777, 11 июн 2023.

Метки:
  1. alex-777

    alex-777 Активный пользователь

    С нами с:
    11 апр 2019
    Сообщения:
    42
    Симпатии:
    0
    Всем привет.

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

    Этого достаточно или необходимо предпринять еще какие действия?

    Спасибо.
     
  2. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.511
    Симпатии:
    284
    Сложно сказать однозначно, наверное вы и сами уже поняли. Иначе бы, вечером в воскресение, за истекшее время, вам бы уже ответили.
    В каких-то проектах, вполне достаточно, а там где сложная иерархия пользователей, да еще и какими-никакими финансовыми отношениями - однозначно нет
     
  3. alex-777

    alex-777 Активный пользователь

    С нами с:
    11 апр 2019
    Сообщения:
    42
    Симпатии:
    0
    Сложной иерархии нет, но чувствительная инфа есть.
    Толкните в нужном направлении, куда копать.
     
  4. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Нафиг ваша абракадабра? Сессии за пределы сервера не уходят. Я пишу просто
    PHP:
    1. $_SESSION["current_user"] = $user->id
    если без фреймворка работаю
    --- Добавлено ---
    Как бы, если вы доступ к серверу или шелл профукали, то эта абракадабра уже не поможет. А другими способами что у вас в сессии постороннему человеку не посмотреть
    --- Добавлено ---
    Да и айдиха юзера обычно и так на фронте мелькает, и сама по себе, в принципе, не является критически важной инфой
     
  5. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.511
    Симпатии:
    284
    Статей на эту тему море, как верно заметили выше, если кто-то каким-то образом получит доступ к содержимому папки с сессиями, то никакой, даже самый запутанный способ не поможет.
    Что могу посоветовать - учиться на готовых решениях. Есть масса свободно распространяемых CMS, интернет-магазинов и тп. Смотрите как сделано там. Копируйте, на ваш взгляд, лишнее отбрасывайте.
    Ну и здравый смысл никто не отменял, если с этим беда, то всё без толку.
     
  6. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.125
    Симпатии:
    1.222
    Адрес:
    там-сям
    https://csplite.com/ru/csp309/
    --- Добавлено ---
    это про способ всё про*ть через ID сессии. данные внутри сессии шифровать вроде бы смысла нет.
     
  7. Aleksandr.B

    Aleksandr.B Активный пользователь

    С нами с:
    2 фев 2023
    Сообщения:
    159
    Симпатии:
    41
    Адрес:
    Барнаул
    Если пользователь разлогинился или сменил пароль в другом браузере, оставлять его авторизованным сомнительно.
     
  8. alex-777

    alex-777 Активный пользователь

    С нами с:
    11 апр 2019
    Сообщения:
    42
    Симпатии:
    0
    А что по вашему разлогинился? Какие действия?
    Разлогинился и есть удаление сессии, то есть прекращение авторизации. А со сменой пароля в другом браузере, тут или при следующем логине, или при проверки аутентификации также отслеживать смену пароля и при необходимости разлогинивать.
     
  9. Aleksandr.B

    Aleksandr.B Активный пользователь

    С нами с:
    2 фев 2023
    Сообщения:
    159
    Симпатии:
    41
    Адрес:
    Барнаул
    Пользователь может быть авторизован в двух браузерах? Если да, то у него будут разные сессии. Нажав на кнопку logout его во втором браузере также разлогинит?
     
  10. alex-777

    alex-777 Активный пользователь

    С нами с:
    11 апр 2019
    Сообщения:
    42
    Симпатии:
    0
    Это нужно отслеживать самому. Но лично я, не даю логиниться в другом браузере залогиненным пользователям.
     
  11. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.125
    Симпатии:
    1.222
    Адрес:
    там-сям
    Для реализации действия "выход на всех устройствах/браузерах" при смене пароля (или при бане, например), вместо ID пользователя заводят аутентификационный токен. Его можно тоже поместить в сессию, если она используется. Этот токен заводят в базе в специальной таблице. Когда пользователь логинится, т.е. проходит аутентификацию А НЕ АВТОРИЗАЦИЮ, БЛИН, помещаем туда этот случайный токен. Всякий раз когда мы получаем токен из сессии или из заголовка запроса, мы ищем его в таблице и при успехе считаем что пользователь идентифицирован. А когда хотим закрыть все активные сеансы данного пользователя, мы удаляем его токены из таблицы.

    идентификация:
    SELECT user_id FROM user_tokens WHERE token=:token

    нормальный логаут в одном браузере
    DELETE FROM user_tokens WHERE token=:token

    логаут на всех устройствах/браузерах:
    DELETE FROM user_tokens WHERE user_id=:id
    --- Добавлено ---
    Сессии в разных браузерах по-любому должны быть разные. Т.е. ID сессии разный. Если кто-то добивается обратного, он пробивает дыру в безопасности.
    При том что сессии разные, пользователю может быть позволено или запрещено быть залогиненным в нескольких местах одновременно — это определяется политиками безопасности конкретного сервиса.
     
    don.bidon нравится это.