Intereting Posts
Как удалить документ, на который ссылается идентификатор в mongoDB из php? Загружать несколько файлов с завихрением Вставить CDATA в XML Почему PHPStorm говорит «dyld: библиотека не загружена: /usr/local/lib/libpng15.15.dylib», когда я запускаю тесты? Обнаружение отмены подписки Paypal Использовать php для задания заданий cron в Windows Php с NetBeans: применение нового PhpDoc без фактического объявления Форма редактирования cann't получить следующие данные для одного и того же пользователя Как работать с длинными ссылками в HTML-письмах Внешний ключ для нескольких таблиц Как отображать адрес электронной почты для пользователей, но скрывать от робота? Есть ли простой способ сделать это с помощью PHP, Javascript или JQuery? Сортировка XML-файла в порядке возрастания с использованием php В cakephp, как я могу найти с условиями в соответствующей области? могу ли я иметь многострочный текст с GD и PHP? Использование $ this, если не в объектном контексте php

Правильный способ управления сеансами в PHP?

В настоящее время я настраиваю систему аутентификации. Мой текущий макет – получить его электронную почту от $_POST , md5 его пароль и проверить базу данных на его электронную почту и его пароль. Если он совпадает, я использую session_start , и я начинаю хранить данные в переменной $_SESSION , например:

  $_SESSION['uid'] = $uid; $_SESSION['first_name'] = $first_name; 

И на каждой странице веб-сайта я бы выполнил простую проверку

 isset($_SESSION['uid']); 

если нет, перенаправляйте на страницу индекса, если есть, загрузите страницу.

Правильно ли я делаю это? Это достаточно безопасно? Насколько легко кому-то подделывать эти данные?

Кто-то сказал мне, что я должен создать таблицу с электронной почтой пользователя и его идентификатор сеанса и использовать это для управления вещами … Я немного запутался – как это поможет?

Может ли кто-нибудь прояснить это? Каков правильный способ управления аутентификацией с помощью сеансов PHP?

Благодарю.

Обновление безопасности : по состоянию на 2017-10-23: Совет в этом ответе, хотя и имеет историческое значение, совершенно небезопасен. Нельзя использовать md5 в хешировании пароля, потому что он настолько грубо принудительно. См. Этот ответ о том, как использовать встроенный пароль_ * api для хэша и проверять пароли.


Раньше я занимался системами входа / аутентификации, и я обнаружил несколько недостатков в этом методе:

  • вы «md5 его пароль и проверьте базу данных» – это означает, что если у человека есть доступ к базе данных, он может разобраться, кто имеет те же пароли!

ДОБАВЛЕНИЕ (19 сентября 2015 г.) * Посмотрите на эту ссылку . В нем объясняются все основы, подходы, которые вы можете предпринять, почему вы должны использовать эти подходы, а также дает образец кода PHP. Если это слишком долго, чтобы читать, просто идите до конца, возьмите код и установите его!

ЛУЧШИЙ ПОДХОД : хранить md5 имени username+password+email+salt в базе данных, соль случайна и храниться вместе с записью пользователя.

  • использование «uid» непосредственно в переменных сеанса может быть очень рискованным. Рассмотрим это: мой друг вошел в систему из моего браузера, и он уходит на утечку. Я быстро проверяю, какие файлы cookie установлены в его браузере, и расшифруйте его «uid». Теперь я его владею!

ЛУЧШИЙ ПОДХОД : для генерации случайного сеанса, когда пользователь входит в систему успешно и сохраняет этот идентификатор сеанса в $_SESSION[] . Вам также необходимо связать sessionid с его uid (используя базу данных или memcached). Преимущества:

  1. Вы даже можете привязать sessionid к определенному IP-адресу, чтобы sessionid нельзя было злоупотреблять, даже если он был захвачен
  2. Вы можете аннулировать старый sessionid, если пользователь входит в систему из другого места. Поэтому, если мой друг входит в систему со своего компьютера, сеанс на моем компьютере автоматически становится недействительным.

EDIT: Я всегда использовал файлы cookie вручную для обработки сеансов. Это помогает мне легче интегрировать javascript-компоненты моих веб-приложений. Возможно, вам понадобится то же самое в ваших приложениях, в будущем.

Нет ничего плохого в этом

 isset($_SESSION['uid']); 

Данные сеанса не передаются пользователю, они хранятся на сервере (или где хранитель сеанса хранит его). То, что передается пользователю, – это идентификатор сеанса, который является просто случайной строкой, генерируемой PHP, это может быть украдено, конечно, потому что оно отправлено пользователю.

Следует четко отметить, что случайное хранение строки в базе данных и сеансе пользователей, а затем ее использование для идентификации пользователя не делает сеанс более безопасным, если злоумышленник получает сеанс, он все равно будет скомпрометировать пользователя.

То, что мы обсуждаем сейчас, это захват сеанса , возможно, вы думаете, что можете просто сохранить IP-адрес в сеансе и проверить, что IP-адрес поступает из запроса и выполняется с ним. Однако часто это не так просто, я обжегся этим недавно, когда в большом веб-приложении мы хранили хэш-адрес User Agent + IP-адреса в сеансе, а затем проверяли, что они соответствуют каждому случаю, для 99% пользователей это сработало хорошо. Тем не менее, мы начали получать звонки от людей, которые обнаружили, что они постоянно выходят из системы без объяснения причин. Мы помещаем регистрацию на проверку захвата сеанса, чтобы узнать, что происходит, и обнаружили, что эти люди войдут в один IP-адрес, и их сеанс продолжится по другому, это не попытка захвата, но это было связано с тем, как их прокси-сервер в результате мы внесли поправки в код захвата сессии, чтобы узнать класс IP-адреса, а оттуда выяснить сетевую часть IP-адреса и сохранить только те части IP-адреса, это немного менее безопасно в этом захвате сеанса теоретически может возникнуть из одной сети, но все наши ложные срабатывания ушли.

Я должен добавить к этому. Если вы используете метод «MD5 пароль, затем проверьте базу данных», это говорит о том, что пароль хранится в одном хэш-файле md5. Это уже не стандартный способ хранения хэшированных паролей.

Я нашел эту ссылку очень информативной: http://www.itnewb.com/tutorial/Encrypting-Passwords-with-PHP-for-Storage-Using-the-RSA-PBKDF2-Standard

Я не на 100% на это, но я думаю, что можно подделать сессию, если кто-то действительно захотел!

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

Я изучил это немного недавно, но опять же не уверен, интересно узнать, что лучше всего!

Вот несколько ресурсов для

http://www.sitepoint.com/article/php-security-blunders/

http://www.phpeasystep.com/workshopview.php?id=6