Термин «сессия» перегружен, чтобы означать разные вещи на сервере и в браузере. Сеансы браузера в лучшем случае связаны с сеансами сервера. «Перехват сеанса» относится к серверу сеансов .
На стороне сервера, сеанс имеет идентификатор (который передается между клиентом и сервером), контент (хранящийся на сервере) и, возможно, другие свойства, такие как время последнего доступа. Идентификатор сеанса обычно передается в виде файла cookie. В PHP именем cookie по умолчанию является «PHPSESSID». Если файлы cookie недоступны, PHP будет (необязательно) использовать параметр строки запроса с тем же именем («PHPSESSID»). Этот файл cookie (или параметр запроса) может быть легко изменен, и поэтому может быть изменен и идентификатор сеанса.
содержимое сеанса (т. Е. Содержащее состояние входа пользователя) не может быть изменено клиентом, данные хранятся на сервере и могут быть изменены только сценарием PHP на этом сервере. , Обратите внимание, что в среде общего хостинга (совместно используемой другими службами или пользователями) сеансы могут быть перезаписаны при использовании каталога хранилища сеансов по умолчанию (/tmp
). Чтобы защититься от этого, используйте базу данных через session_set_save_handler()
или задайте пользовательский каталог сеанса, используя session.save_path
с надлежащими установленными разрешениями для каталога (предпочтительно 700, что означает, что только владелец (пользователь PHP) может читать и писать в него).
Для защиты от перехвата сеанса у вас должны быть другие способы идентификации пользователя в сеансе. Это может быть пользовательский агент, IP-адрес или другой файл cookie. Ранее упомянутые методы являются просто обходными путями, лучший способ защиты от кражи cookie сеанса - использование HTTPS, если сеанс задействован. Не забудьте установить флаг httponly
на true
, используя session_set_cookie_params()
На стороне клиента «сессия» снова перегружается и используется в различных контекстах (например, менеджеры сеансов, которые восстанавливают открытые страницы при открытии браузера, куки-файлы сеансов и sessionStorage
). Мы можем попытаться объединить эти значения (в то, что ни в коем случае не является стандартным), сказав, что сеанс браузера состоит из набора представлений и связанных с ними данных. (Под «представлением» я понимаю грубо вкладки в браузерах с вкладками и окна в браузерах без вкладок; объект DOM window
предоставляет представление JS.) Каждое представление имеет историю, текущую страницу и данные страницы. Данные страницы для страниц в одном домене распределяются между представлениями в сеансе; если две страницы находятся в разных доменах или в разных сеансах, они не обмениваются данными. Выход из браузера закрывает все открытые сеансы, возможно сохраняя часть сеансов (например, истории, текущие страницы, sessionStorage
), чтобы менеджер сеансов мог их снова открыть. Сессионные куки - это куки, которые отбрасываются, когда сессия закрывается; другими словами, сеансовые куки не являются постоянными. Хотя cookie-файл сеанса может содержать идентификатор сеанса, эти две концепции являются ортогональными (смысл 4; cookie-файлы сеанса могут содержать вещи, отличные от идентификаторов сеанса, и идентификаторы сеанса могут храниться в постоянных файлах cookie).
Наличие двух разных представлений в одной коллекции зависит от браузера. Например, один браузер может считать сеанс состоящим из всех вкладок в одном окне; отдельные окна - это отдельные сеансы. IE8 позволяет пользователям создавать новые сеансы с помощью пункта меню «Новый сеанс». В противном случае новые окна и вкладки открываются в одном сеансе. Режимы конфиденциальности также создают новые сеансы.
В итоге, сеансы браузера действительно устанавливаются браузером, хотя он предоставляет пользователям различные средства управления сеансами браузера: создание новых сеансов, изменение истории и текущей страницы в представлении путем просмотра, сохранения и восстановления сеансов. Пользователь может даже изменить данные сеанса, отредактировав сеансы, сохраненные на диске, хотя эта функция не предоставляется браузером. Ничто из этого не имеет никакого отношения к угону сессии. Сеансы сервера создаются и управляются сервером, но пользователи могут (пытаться) переключать сеансы сервера, изменяя идентификатор сеанса, который их браузер передает обратно на сервер, что является основой для перехвата сеанса.
См. Также Фиксация сессии PHP / Угон .