Введение
Так как в PHP 5.5.2 есть параметр конфигурации времени выполнения (session.use_strict_mode), который предназначен для предотвращения фиксации сеанса вредоносными клиентами. Когда эта опция включена и используется собственный обработчик сеанса (файлы), PHP не будет принимать идентификатор входящего сеанса, который ранее не существовал в область хранения сеанса, например:
$ curl -I -H "Cookie:PHPSESSID=madeupkey;" localhost
HTTP/1.1 200 OK
Cache-Control: no-store, no-cache, must-revalidate
Connection: close
Content-type: text/html; charset=UTF-8
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Host: localhost
Pragma: no-cache
Set-Cookie: PHPSESSID=4v3lkha0emji0kk6lgl1lefsi1; path=/ <--- looky
(при отключенном session.use_strict_mode
ответ будет содержать не заголовок Set-Cookie
, а файл sess_madeupkey
был бы создан в каталоге сеансов)
Проблема
Я в процессе реализации настраиваемого обработчика сеансов, и я бы очень хотел придерживаться строгого режима, однако интерфейс затрудняет работу.
Когда вызывается session_start()
, строка MyHandler::read($session_id)
вызывается по строке, но $session_id
может быть или значением, полученным из файла cookie или. идентификатор сессии. Обработчик должен знать разницу, потому что в первом случае ошибка должна быть повышена, если идентификатор сеанса не найден. Более того, согласно spec read($session_id)
, необходимо возвращать содержимое сеанса или пустую строку (для новых сеансов), но, похоже, нет способа поднять ошибку в цепочке.
Итак, чтобы подвести итог, вопросы, которые мне нужно ответить, чтобы соответствовать собственному поведению:
-
Из контекста
read($session_id)
, как я могу определить разницу между новым чеком идентификатора сеанса или идентификатором сеанса, который пришел из HTTP-запроса? -
Учитывая идентификатор сеанса, который пришел из HTTP-запроса и предположил, что он не был обнаружен в области хранения, как я могу сообщить об ошибке движку PHP, чтобы он снова вызывал
read($session_id)
с помощью нового идентификатор сеанса?