Страница 1 из 1

PHP сессии. Безопасность и авторизация.

Добавлено: Пт мар 13, 2009 01:35
sadman
Итак, друзья, есть такой механизм:
Чел заходит на страницу и авторизируется. Если всё окей, сетаем $_SESSION['logged_in']=true;
Всё. Далее просто на каждой странице проверяется эта переменная, если true значит всё ок.
Насколько я понимаю, с другого компа зайти не авторизировавшись не получится. Т.е. вручную проставить $_SESSION['logged_in'] в true невозможно.
Если всё так, то зачем юзаются все мудрёности типа PHPSESSID в куках или в адресной строке, и т.п.?

Добавлено: Пт мар 13, 2009 02:36
Злобный
а как на сервере определять с кем ты общаешься? с которым из клиентов? вот пришел запрос на сервер - дай мне мои профильные данные. как сервер определит, чьи данные ему надо вернуть? нужны идентификаторы сессии, чтобы одного клиента отличать от другого. я с пхп не работал никогда, но без такого механизма ни одна подобная модель работать не может.

Добавлено: Пт мар 13, 2009 04:05
Молдафский Кавалерист
В cookie сохраняется идентификатор сессии. Если в браузере cookie отключены то id сессии может передаватся как первый параметр в адресной строке(GET запрос). Сервер([off]вернее модуль серверного php модуля[/off]) видит этот cookie и поддерживает данные которые ты(как программист) сохраняешь в сессии([off]глобальный массив $_SESSION[][/off]).
Cookie с id сессии автоматически сохраняется в браузере после вызова функции session_start(). Также становится доступным глобальный массив $_SESSION([off]и константа SID содержащая самo значение идентификаторa[/off]).
session_start() создает новую сессию если она не создана, или востанавливает данные сессии([off]то что было сохранено в $_SESSION[/off]) если она уже была создана при предыдущих запросах.

Есть много функций с помощью которых настраивается весь процесс работы сессии([off]время жизни этого cookie, разрушение сессии session_destroy() итд[/off]).

Добавлено: Пт мар 13, 2009 11:20
sadman
Ну хорошо. А что мне мешает хранить идентификатор пользователя в той-же сессии, скажем, в переменной $_SESSION['userID'] ?

Добавлено: Пт мар 13, 2009 18:07
Злобный
sadman писал(а):Ну хорошо. А что мне мешает хранить идентификатор пользователя в той-же сессии, скажем, в переменной $_SESSION['userID'] ?
смотри на объект $_SESSION, как на коллекцию для хранения объектов, которая создается для каждого присоединившегося пользователя. То есть сервер хранит кучу таких коллекций одновременно. По одной на соединение. Как он узнает, что тебе он должен отдать именно этот объект $_SESSION, а не какой-то другой? Не тот, который создался для твоего соседа. Объекты сессии должны как-то различаться между собой. Они различаются по SessionID. Твой клиент соединяется и говорит "дайте мне мой объект $_SESSION, вот мой SessionID". Почитай книжку что ли.

Добавлено: Пт мар 13, 2009 22:34
sadman
Спасибо, тов Злобный. Почитал теорию про работу сессий. Насколько я понял из прочитанного, session Id создаётся по умолчанию, и хранится либо в куках либо встраивается в урлу. Но делается это всё автоматом, так ведь? Т.е. МНЕ фактически об этом заботиться по идее не нужно, т.к. делает за меня всё ПХП.
Т.е. я, юзая сессии, уверен что Сервер будет присваивать всем клиентам которые зашли (с разных тачек) идентификатор. И если Жора и Вася со свих компом зайдут, и для Жоры $_SESSION['user'] будет равен Jora, а для Васи, соответственно, Vasea, никакой путаницы на сервере возникнуть Не должно.
Я правильно понял?

Добавлено: Сб мар 14, 2009 00:02
Злобный
Правильно. По своим уникальным SessionId они получат доступ только к своим объектам $_SESSION. Полагаю, что вся работа по передаче и хранению SessionId делается за тебя. В ASP (и ASP.NET), по крайней мере, работает так. С ПХП дела никогда не имел, но почти наверняка там это тоже делается без твоего участия. Разве что можешь настроить, где идентификатор сессии хранить (в куках или в урл).

Добавлено: Сб мар 14, 2009 00:38
sadman
Так есть! Настраивается это дело в php.ini.
Теперь ключевой вопрос - если всё так, то мне для авторизации юзверя достаточно хранить (руками) только, скажем, $_SESSION['logged']=true ?
Подделать это дело фактически невозможно, т.к. хранится оно на сервере. Значит реально ничё больше не надо, так? (имеется ввиду для примитивной авторизации, без прав доступа и т.п. )

Добавлено: Сб мар 14, 2009 00:45
Молдафский Кавалерист
sadman писал(а):Т.е. МНЕ фактически об этом заботиться по идее не нужно, т.к. делает за меня всё ПХП.
Нед. Нужно заботится, чтo-бы вызов функции session_start() происходил раньше чем браузеру будет отправлен какой-то контент. Правила как и для header(), так как cookie передается в http заголовке(http headers).
Подделать это дело фактически невозможно, т.к. хранится оно на сервере.
Ну, например можно украсть cookie пакетным сниффером.

Добавлено: Сб мар 14, 2009 00:48
sadman
Молдафский Кавалерист,
Это я знаю. Не вчера я узнал о сессиях. просто реальным функционированием заинтересовался на днях. до сих пор так, накидал када надо было срочно, работало )

Добавлено: Сб мар 14, 2009 00:59
Молдафский Кавалерист
Ты должен вызывать session_destroy() если юзер нажал log out или sign out.
И удалить поставленный в браузере cookie сессии:

Код: Выделить всё

if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), '', time()-42000, '/');
}
И это только начало.

Все это есть на php.net .

Добавлено: Сб мар 14, 2009 01:37
sadman
Молдафский Кавалерист,
Спасибо, конечно, но к чему это было?

Добавлено: Сб мар 14, 2009 16:14
Молдафский Кавалерист
В предверии праздников

Добавлено: Ср апр 08, 2009 10:56
=MIA=
sadman,
спасибо за полезную темку, тоже уяснила для себя сессии :)