PHP « ID пользователя в Куки или в Сессию?

Прочитав статью про безопасный метод авторизации, возник вопрос, где хранить данные пользователя, который вошёл в систему? В сессии или в куках? В чём разница? Что безопаснее? Как-то в статье про сессии ничего не сказано.

Так понимаю, что в каки надо записывать (разумеется с кешом) в том случае, если необходимо «запомнить» пользователя, т.е. чтобы в следующий раз не пришлось вводить пароль.
Если запоминать не надо, то тогда в сессии?

1 ответов


У сессии сам по себе механизм защищен. Если вы хотите экзотику - то можете изменить поведение сессии http://php.net/manual/en/function.session-set-save-handler.php
Следует понимать, что идентификатор сессии хранится в куках и поэтому может быть стырен. Как избежать проблем я уже писал здесь: PHP → безопасные сессии в php - это возможно? В куках следует хранить только remember_hash - каким-то образом сгенерированная и зашифрованная строка, по которой однозначно можно опознать пользователя. что-нибудь типа

<?php sha1($user.$pass.$sault); ?>Для MySQL соответственно:
SHA1(CONCAT(`user`,`pass`,"sault"));
Намного быстрее будет, если ремембер-хеш будет храниться в таблице. Можете даже его переписывать.
Вот основные моменты:
Юзер залогинился с галкой remember. - Записали хеш в куку и в таблицу, данные в сессию.
Юзер залогинился без remember. - Развернули сессию.
Юзер разлогинился - стерли куку и хеш(при наличии). Очистили сессию.
Юзер зашел на сайт сессия открыта. - Продолжаем работу.
Юзер зашел на сайт, в сессии нет данных. будем искать куку с хешем.
Юзер зашел на сайт, нет сессии, есть кука с хешем. - Проверяем хеш, все ОК. Разворачиваем сессию.
Юзер зашел на сайт, нет сессии, нет куки с хешем. - Пожалуйста, авторизируйтесь.

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


У сессии есть таймаут, т.е. человек отошел на обед - 40 минут прошло (например) - пришел, а он уже разлогинился... Вот облом, да? :-)


Только в сессию... на клиенте пусть хранится только идентификатор... можно подумать и поднастроить таймаут сессии... но все данные лучше писать в нее...
Ибо подобрать идентификатор пользователя в куках и изменить его проще (время на дешифрацию если что не в счет, да и зачем ;) )... чем подобрать идентификатор сессии и попасть на нужного пользователя...
Так что лучше так.... если уж параноя, но можешь в сессию сохранить IP адрес например пользователя и проверять его периодически... тогда будешь более менее защищен от того что кто-то попытается войти в сессию другого пользователя... ))
Вдобавок в сессию можно поместить больше данных и они не будут сказываться на скорости запросов как куки... которые передаются каждый раз от клиента...
Тут на клиенте будет только никому не понятный идентификатор сессии...
Можно конечно и сессии в БД хранить и генерить свои идентификаторы, но это требует реализации, а соответственно и времени...
Хотя в конечном итоге выбор все равно за вами..


По хорошему надо делать так:
- в куке хранить случайно сгенерированный идентификатор сессии на короткое время или вечно, в зависимости от выбора пользователя (знаете, обычно делают такой чекбокс "запомнить меня"), а уже по идентификатору сессии на стороне сервера хранить всю остальную информацию о сессии: кто ей пользуется (user id), временные настройки в рамках данной сессии и т.п.


Я предпочитаю комплекстный подход: зашифрованные куки + БД