К сожалению ответов на свои вопросы не нашел, если повторюсь, прошу простить. Пишу сайт на php в качестве дипломного проекта, однако после защиты планирую его запускать, и по этому заранее пекусь о безопасности. При аутентификации на сайте, после закрытия браузера данные о пользователе должны сохраниться, чтобы пользователь вновь не регистрировался. 1) На сколько я понял, лучше использовать session, а не отдельно cookie, верно? 2) Как современных сайтах (вк, или здесь же на php.ru) работает система сессий? Через session_start(), или другим способом? 3) Если всё работает на session_start(), или же куки, то какие данные сохраняются в них? Допустим, для аутентификации на моём сайте нужны только Email и Password. В сессии/куки мы сохраняем Авторизован, или нет / Только Email / Email and password / другие варианты? 4) Исходя из 3го вопроса, каким образом должна проходить проверка аутентифицирован ли юзер, или нет? Допустим в сессии сохраняется пароль, тогда всё понятно, сверяем. А если это только Email, то мы уже не проверяем, а верим куки на слово? Из 3 и 4 вопросов польются ещё вопросы, так что заранее извиняюсь и благодарю.
нет. по моему скромному мнению, не лучше и не хуже. во-первых, сессии работают через куки. так что проблемы у них общие. куки (без сессии) вполне можно использовать для идентификации пользователя. мало того, в системах на сессиях опцию "запомнить меня на данном компьютере" реализуют внезапно™ через идентификационную куку. надо только не допускать глупых ошибок вроде хранения в куке пароля (или его хеша) или значения is_admin. это может быть своя реализация сессий, как в Laravel. на самом деле напрямую не влияет на безопасность. это может иметь значение для удобства тестирования. ты можешь "замокать" объект request, но не можешь подменить встроенную в php систему. в сессионной переменной ты можешь хранить буквально ID пользователя. это значение всё равно недоступно на клиентской стороне. пока сессионная кука не украдена, сессионные данные можно считать защищенными по ID ты можешь извлечиь из базы прочую информацию, так что засовывать всё в сессию не обязательно. в случае идентификации по куке, там может быть, как вариант, ID+время+хеш. этот хеш высчитывается от ID+время+секретный ключ. по теме можешь почитать про алгоритм HMAC - он позволяет проверять достоверность открытых данных. метка времени может пригодиться для устаревания. почитай ещё про аутентификацию по токену.
взял, скопировал/сфоткал/слизал значение куки - смысл секретности потерян. Ремембер логика восстановит доступ.
То есть, если я буду использовать сессии, достаточно только хранить id пользователя, и это будет достаточно для безопасности? Не могли бы вы пожалуйста подсказать, следующий код достаточно безопасен для обычного сайта? Код (Text): session_start(); if (isset($_SESSION['id'])){ $loginQuery = mysqli_query($conn, SELECT * FROM `users` WHERE `user_id` LIKE '$_SESSION['id']'"); $user = mysqli_fetch_assoc($loginQuery); echo $user['username']; //а так же прочие функции а-ля профиль, настройки, новый пост, к примеру и прочая приватная информация }else{ //выводить логин форму } И ещё один вопрос, верно ли будет с моей стороны размещать похожую проверку на каждой приватной странице?
Я плохо тебя понимаю Смысла копировать не больше, чем копировать сессионную куку. Свою копируй на здоровье, это никому не повредит. А создать фейковую чтобы проканала за настоящую почти нереально. Маус, там присутствует подпись, защищающая от подделки. --- Добавлено --- Не могу подсказать. Я не читаю код, который не соизволили даже оформить отступами. Хранение ID в сессии безопасно. А в целом безопасность настолько хороша, насколько хорошо самое слабое звено.
У сессий с этим есть проблемы. В смысле «не логинился»? Нет. По сути сессии – это надстройка для ленивых. Работа с авторизационными ключами. Плюс готовый кэш (по умолчанию) на файлах, id там сохранить, ник. ЧЁ? Аутентификационные данные в куках, серьезно? Читаем основы (начало статьи; в реализацию можно не погружаться, она топорная): Как сделать авторизацию пользователя?