За последние 24 часа нас посетили 21825 программистов и 1008 роботов. Сейчас ищут 659 программистов ...

Несколько вопросов по сессиям при аутентификации на сайте

Тема в разделе "PHP для новичков", создана пользователем vl174, 24 янв 2020.

  1. vl174

    vl174 Новичок

    С нами с:
    24 янв 2020
    Сообщения:
    3
    Симпатии:
    0
    К сожалению ответов на свои вопросы не нашел, если повторюсь, прошу простить.
    Пишу сайт на php в качестве дипломного проекта, однако после защиты планирую его запускать, и по этому заранее пекусь о безопасности. При аутентификации на сайте, после закрытия браузера данные о пользователе должны сохраниться, чтобы пользователь вновь не регистрировался.

    1) На сколько я понял, лучше использовать session, а не отдельно cookie, верно?

    2) Как современных сайтах (вк, или здесь же на php.ru) работает система сессий? Через session_start(), или другим способом?

    3) Если всё работает на session_start(), или же куки, то какие данные сохраняются в них? Допустим, для аутентификации на моём сайте нужны только Email и Password. В сессии/куки мы сохраняем Авторизован, или нет / Только Email / Email and password / другие варианты?

    4) Исходя из 3го вопроса, каким образом должна проходить проверка аутентифицирован ли юзер, или нет? Допустим в сессии сохраняется пароль, тогда всё понятно, сверяем. А если это только Email, то мы уже не проверяем, а верим куки на слово?

    Из 3 и 4 вопросов польются ещё вопросы, так что заранее извиняюсь и благодарю.
     
  2. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    А где и как искал? Да это и не важно. Сессии надо было учить ещё до поступления, а не перед защитой.
     
  3. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    нет. по моему скромному мнению, не лучше и не хуже. во-первых, сессии работают через куки. так что проблемы у них общие.
    куки (без сессии) вполне можно использовать для идентификации пользователя. мало того, в системах на сессиях опцию "запомнить меня на данном компьютере" реализуют внезапно™ через идентификационную куку. надо только не допускать глупых ошибок вроде хранения в куке пароля (или его хеша) или значения is_admin.

    это может быть своя реализация сессий, как в Laravel. на самом деле напрямую не влияет на безопасность. это может иметь значение для удобства тестирования. ты можешь "замокать" объект request, но не можешь подменить встроенную в php систему.

    в сессионной переменной ты можешь хранить буквально ID пользователя. это значение всё равно недоступно на клиентской стороне. пока сессионная кука не украдена, сессионные данные можно считать защищенными :) по ID ты можешь извлечиь из базы прочую информацию, так что засовывать всё в сессию не обязательно.
    в случае идентификации по куке, там может быть, как вариант, ID+время+хеш. этот хеш высчитывается от ID+время+секретный ключ. по теме можешь почитать про алгоритм HMAC - он позволяет проверять достоверность открытых данных. метка времени может пригодиться для устаревания.

    почитай ещё про аутентификацию по токену.
     
    #3 artoodetoo, 25 янв 2020
    Последнее редактирование: 25 янв 2020
    vl174 и AlexandrS нравится это.
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    взял, скопировал/сфоткал/слизал значение куки - смысл секретности потерян. Ремембер логика восстановит доступ.
     
  5. vl174

    vl174 Новичок

    С нами с:
    24 янв 2020
    Сообщения:
    3
    Симпатии:
    0
    То есть, если я буду использовать сессии, достаточно только хранить id пользователя, и это будет достаточно для безопасности?

    Не могли бы вы пожалуйста подсказать, следующий код достаточно безопасен для обычного сайта?
    Код (Text):
    1.  
    2. session_start();
    3. if (isset($_SESSION['id'])){
    4.  
    5. $loginQuery = mysqli_query($conn, SELECT * FROM `users` WHERE `user_id` LIKE '$_SESSION['id']'");
    6. $user = mysqli_fetch_assoc($loginQuery);
    7. echo $user['username'];
    8. //а так же прочие функции а-ля профиль, настройки, новый пост, к примеру и прочая приватная информация
    9. }else{
    10. //выводить логин форму
    11. }
    И ещё один вопрос, верно ли будет с моей стороны размещать похожую проверку на каждой приватной странице?
     
  6. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Я плохо тебя понимаю :) Смысла копировать не больше, чем копировать сессионную куку. Свою копируй на здоровье, это никому не повредит. А создать фейковую чтобы проканала за настоящую почти нереально. Маус, там присутствует подпись, защищающая от подделки.

    --- Добавлено ---
    Не могу подсказать. Я не читаю код, который не соизволили даже оформить отступами.

    Хранение ID в сессии безопасно. А в целом безопасность настолько хороша, насколько хорошо самое слабое звено.
     
  7. vl174

    vl174 Новичок

    С нами с:
    24 янв 2020
    Сообщения:
    3
    Симпатии:
    0
    Виноват, но в целом понял. Спасибо.
     
  8. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    У сессий с этим есть проблемы.

    В смысле «не логинился»?

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

    ЧЁ? Аутентификационные данные в куках, серьезно? Читаем основы (начало статьи; в реализацию можно не погружаться, она топорная): Как сделать авторизацию пользователя?
     
    vl174 нравится это.