Захват сеанса PHP

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

Может ли пользователь изменить свою сессию на моем веб-сайте? т.е. если у них есть сеанс X при входе в систему, могут ли они изменить этот сеанс на Y или Z, если они этого захотят?

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

Термин «сеанс» перегружен, чтобы означать разные вещи на сервере и в браузере. Сессии браузера в лучшем случае связаны с сеансами сервера. «Захват сеанса» относится к сеансам сервера.

На стороне сервера сеанс имеет идентификатор (который передается между клиентом и сервером), содержимое (хранящееся на сервере) и потенциально другие свойства, такие как время последнего доступа. Идентификатор сеанса обычно передается как файл cookie. В PHP именем по умолчанию для файла cookie является «PHPSESSID». Если файлы cookie недоступны, PHP (необязательно) использует параметр строки запроса с тем же именем («PHPSESSID»). Этот файл cookie (или параметр запроса) можно легко изменить, и поэтому идентификатор сеанса также может быть изменен.

Содержимое сеанса (т. Е. Содержит состояние входа пользователя) не может быть изменено клиентом, данные хранятся на сервере и могут быть изменены только скриптом PHP на этом сервере. Обратите внимание: в среде с общим хостингом (совместно используемой другими службами или пользователями) сеансы могут быть перезаписаны при использовании каталога хранения по умолчанию ( /tmp ). Чтобы защитить от этого, либо используйте базу данных через session_set_save_handler() либо настройте настраиваемую папку сеанса с помощью session.save_path с установленными соответствующими разрешениями каталога (предпочтительно 700, что означает, что только владелец (пользователь PHP) может читать и писать на него) ,

Для защиты от захвата сеанса у вас должны быть другие способы идентифицировать пользователя в сеансе. Это может быть пользовательский агент, IP-адрес или другой файл cookie. Ранее упомянутые методы являются обходными способами, лучшим способом защиты от кражи сеансового файла является использование HTTPS, если речь идет о сеансе. Не забудьте установить флаг httponly в true используя session_set_cookie_params()

Клиентская сторона, «сеанс» снова перегружается и используется в различных контекстах (например, диспетчеры сеансов, которые восстанавливают открытые страницы при открытии браузера, куки сеанса и sessionStorage ). Мы можем попытаться объединить эти значения (в том, что отнюдь не стандартное), заявив, что сеанс браузера состоит из коллекции представлений и связанных с ними данных. (Под «представлением» я подразумеваю грубые вкладки в браузерах с вкладками и окнах в не-вкладных браузерах, а объект window DOM предоставляет представление JS.) Каждый вид имеет историю, текущую страницу и данные страницы. Данные страницы для страниц в одном домене разделяются между представлениями в сеансе; если две страницы находятся в разных доменах или разных сеансах, они не делят данные. Выход из браузера закрывает все открытые сеансы (ы), возможно, сохраняя часть сеансов (например, истории, текущие страницы, sessionStorage ), чтобы диспетчер сеанса мог повторно открыть их. Файлы cookie сеанса – это файлы cookie, которые отбрасываются при закрытии сеанса; другими словами, файлы cookie сеанса не являются стойкими. Хотя файл cookie сеанса может содержать идентификатор сеанса, эти две концепции ортогональны (смысл 4, файлы cookie сеанса могут содержать объекты, отличные от идентификаторов сеанса, а идентификаторы сеансов могут храниться в постоянных файлах cookie).

Независимо от того, зависит ли два разных вида в одной коллекции от браузера. Например, один браузер может считать сеанс состоящим из всех вкладок в одном окне; отдельными окнами являются отдельные сеансы. IE8 позволяет пользователям создавать новые сеансы через пункт меню «Новая сессия». В противном случае новые окна и вкладки будут открываться в том же сеансе. Режимы конфиденциальности также создают новые сеансы.

Таким образом, браузерные сеансы действительно устанавливаются браузером, хотя он предоставляет пользователям различные способы управления сеансами браузера: создание новых сеансов, изменение истории и текущей страницы в режиме просмотра, сохранение и восстановление сеансов. Пользователь может даже изменять данные сеанса, редактируя сеансы, сохраненные на диске, хотя это не функция, предоставляемая браузером. Ничто из этого не имеет ничего общего с захватом сессии. Сеансы сервера создаются и управляются сервером, но пользователи могут (пытаться) переключать сеансы сервера, изменяя идентификатор сеанса, который их браузер передает на сервер, что является основой для захвата сеанса.

См. Также Fixation / Hijacking PHP Session .

Пользователь может изменить свою сессию в любое время. Это просто случайная строка, хранящаяся в cookie в браузере пользователей, и поэтому пользователю очень просто ее изменить.

Поскольку фактическое содержимое сеанса хранится на вашем сервере, вы можете, например, сохранить ip-адрес пользователя, пользовательский агент или аналогичный, чтобы затруднить кражу сеансов друг от друга, проверяя, соответствует ли эта информация каждый раз, когда новый http запрос сделан.