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

Модератор: Злобный

Ответить
Аватара пользователя
sadman
Завсегдатай
Сообщения: 2001
Зарегистрирован: Чт дек 15, 2005 23:46
Откуда: с ботаники
Контактная информация:

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

Сообщение sadman »

Итак, друзья, есть такой механизм:
Чел заходит на страницу и авторизируется. Если всё окей, сетаем $_SESSION['logged_in']=true;
Всё. Далее просто на каждой странице проверяется эта переменная, если true значит всё ок.
Насколько я понимаю, с другого компа зайти не авторизировавшись не получится. Т.е. вручную проставить $_SESSION['logged_in'] в true невозможно.
Если всё так, то зачем юзаются все мудрёности типа PHPSESSID в куках или в адресной строке, и т.п.?
Аватара пользователя
Злобный
Завсегдатай
Сообщения: 2716
Зарегистрирован: Сб июн 18, 2005 21:05
Контактная информация:

Сообщение Злобный »

а как на сервере определять с кем ты общаешься? с которым из клиентов? вот пришел запрос на сервер - дай мне мои профильные данные. как сервер определит, чьи данные ему надо вернуть? нужны идентификаторы сессии, чтобы одного клиента отличать от другого. я с пхп не работал никогда, но без такого механизма ни одна подобная модель работать не может.
Аватара пользователя
Молдафский Кавалерист
Завсегдатай
Сообщения: 2399
Зарегистрирован: Ср июн 25, 2008 22:25
Контактная информация:

Сообщение Молдафский Кавалерист »

В 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]).
Аватара пользователя
sadman
Завсегдатай
Сообщения: 2001
Зарегистрирован: Чт дек 15, 2005 23:46
Откуда: с ботаники
Контактная информация:

Сообщение sadman »

Ну хорошо. А что мне мешает хранить идентификатор пользователя в той-же сессии, скажем, в переменной $_SESSION['userID'] ?
Аватара пользователя
Злобный
Завсегдатай
Сообщения: 2716
Зарегистрирован: Сб июн 18, 2005 21:05
Контактная информация:

Сообщение Злобный »

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

Сообщение sadman »

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

Сообщение Злобный »

Правильно. По своим уникальным SessionId они получат доступ только к своим объектам $_SESSION. Полагаю, что вся работа по передаче и хранению SessionId делается за тебя. В ASP (и ASP.NET), по крайней мере, работает так. С ПХП дела никогда не имел, но почти наверняка там это тоже делается без твоего участия. Разве что можешь настроить, где идентификатор сессии хранить (в куках или в урл).
Аватара пользователя
sadman
Завсегдатай
Сообщения: 2001
Зарегистрирован: Чт дек 15, 2005 23:46
Откуда: с ботаники
Контактная информация:

Сообщение sadman »

Так есть! Настраивается это дело в php.ini.
Теперь ключевой вопрос - если всё так, то мне для авторизации юзверя достаточно хранить (руками) только, скажем, $_SESSION['logged']=true ?
Подделать это дело фактически невозможно, т.к. хранится оно на сервере. Значит реально ничё больше не надо, так? (имеется ввиду для примитивной авторизации, без прав доступа и т.п. )
Аватара пользователя
Молдафский Кавалерист
Завсегдатай
Сообщения: 2399
Зарегистрирован: Ср июн 25, 2008 22:25
Контактная информация:

Сообщение Молдафский Кавалерист »

sadman писал(а):Т.е. МНЕ фактически об этом заботиться по идее не нужно, т.к. делает за меня всё ПХП.
Нед. Нужно заботится, чтo-бы вызов функции session_start() происходил раньше чем браузеру будет отправлен какой-то контент. Правила как и для header(), так как cookie передается в http заголовке(http headers).
Подделать это дело фактически невозможно, т.к. хранится оно на сервере.
Ну, например можно украсть cookie пакетным сниффером.
Последний раз редактировалось Молдафский Кавалерист Сб мар 14, 2009 00:50, всего редактировалось 1 раз.
Аватара пользователя
sadman
Завсегдатай
Сообщения: 2001
Зарегистрирован: Чт дек 15, 2005 23:46
Откуда: с ботаники
Контактная информация:

Сообщение sadman »

Молдафский Кавалерист,
Это я знаю. Не вчера я узнал о сессиях. просто реальным функционированием заинтересовался на днях. до сих пор так, накидал када надо было срочно, работало )
Аватара пользователя
Молдафский Кавалерист
Завсегдатай
Сообщения: 2399
Зарегистрирован: Ср июн 25, 2008 22:25
Контактная информация:

Сообщение Молдафский Кавалерист »

Ты должен вызывать session_destroy() если юзер нажал log out или sign out.
И удалить поставленный в браузере cookie сессии:

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

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

Все это есть на php.net .
Аватара пользователя
sadman
Завсегдатай
Сообщения: 2001
Зарегистрирован: Чт дек 15, 2005 23:46
Откуда: с ботаники
Контактная информация:

Сообщение sadman »

Молдафский Кавалерист,
Спасибо, конечно, но к чему это было?
Аватара пользователя
Молдафский Кавалерист
Завсегдатай
Сообщения: 2399
Зарегистрирован: Ср июн 25, 2008 22:25
Контактная информация:

Сообщение Молдафский Кавалерист »

В предверии праздников
Аватара пользователя
=MIA=
Отец
Сообщения: 4635
Зарегистрирован: Сб июл 02, 2005 15:25
Откуда: Кишинев
Контактная информация:

Сообщение =MIA= »

sadman,
спасибо за полезную темку, тоже уяснила для себя сессии :)
Ответить

Вернуться в «Программирование»