как реализовать расширенную обработку сессии в PHP

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

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

  1. На первом доступе я генерировал бы уникальный session_id и создал бы cookie
  2. На конце сценария сохраняют данные сессии с session_id, метками времени для запуска сессии и последнего доступа и данных из $ _SERVER, такими как REMOTE_ADDR, REMOTE_PORT, HTTP_USER_AGENT.
  3. На каждом доступе chceck база данных для session_id, отправленного в cookie от клиента, проверьте IP, Порт и агент пользователя (для безопасности) и считайте данные в переменную сеанса (если не истек).
  4. Если session_id истек, удалите из базы данных.

Та переменная сеанса была бы реализована как одиночный элемент (я знаю, что получил бы плотное соединение с этим классом, но я не знаю о лучшем решении).

Я пытаюсь извлечь следующую пользу:

  • Переменные сеанса, невидимые в другом, пишут сценарий на том же сервере и том же домене
  • Пользовательское управление истечением сессии
  • Способ видеть открытые заседания (что-то как список подключенных пользователей)

я не уверен, пропускаю ли я какие-либо недостатки этого решения. Есть ли какой-либо лучший путь?

Спасибо!!

ОБНОВЛЕНИЕ: я не объяснил это достаточно подробно и вызвал много беспорядка здесь, таким образом, я хочу сделать более ясным, с чем я имею дело:

Я создаю серверное приложение SOA, которое было бы развернуто во многих различных средах. Это не будет иметь своего собственного веб-сервера, таким образом, в тех средах мог быть другой приложения PHP. У сотрудников этих компаний будут учетные записи пользователей в этом приложении, таким образом, они получат cookie с идентификатором сессии в это приложение.

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

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

Таким образом, мой вопрос, если Вы видите что-то, которое менее безопасно, менее гибко в моем дизайне, чем это было бы с управлением сеансами по умолчанию..

Спасибо за Ваши ответы..

6
задан marianboda 11 May 2010 в 09:47
поделиться

6 ответов

Вам нужно использовать:

session_set_cookie_params()

http://www.php.net/manual/en/function.session-set-cookie-params.php

В частности, вам нужно установить "путь" в каждом из ваших webapp.

2
ответ дан 17 December 2019 в 04:43
поделиться

Вот что вы можете узнать:

  • Задайте путь и домен идентификатора сеанса. Если домен .mastergaurav.com, файлы cookie будут отправлены обратно на mastergaurav.com, www.mastergaurav.com, blogs.mastergaurav.com и т. Д.
  • Возможно, вместо использования идентификатора сеанса в качестве файла cookie - если вам нужно действительно проходить через несколько доменов TLD - сделайте его частью URL для полностью настраиваемой реализации:
    abcd.php? = & domain =
1
ответ дан 17 December 2019 в 04:43
поделиться

я не уверен, не упускаю ли я из виду какие-либо недостатки этого решения. Есть ли способ лучше?

это очень сложно - и не сработает, например remote_port будет меняться между запросами, remote_addr может измениться.

Есть по крайней мере 2 очень очевидных решения без изменения способа работы обработки сеанса:

1) использовать разные имена cookie для сеанса в каждом приложении - см. session_name ()

2) иметь каждое приложение в другом подкаталоге (например, http://example.com/app1/ , http://example.com/app2/ , ...) и установите путь на файл cookie - см. session_set_cookie_params или используйте другие настройки ini для session.cookie_path

0
ответ дан 17 December 2019 в 04:43
поделиться

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

Если вы думаете о сериализации ваших объектов, я не рекомендую, так как это не очень хорошая практика для хранения безопасных данных.

http://www.php.net/manual/en/function.session-set-save-handler.php#81761

Посмотрите на приведенный выше пример, он дает хорошее решение.

Поддержание состояния в разных доменах.

  1. Сначала создайте уникальный идентификатор.
  2. Вы можете создать cookie, который считывается при каждом обращении к странице. При каждом обращении к странице cookie отправляется из браузера на сервер.
  3. Также вы можете передавать свой уникальный идентификатор как часть каждого URL, который вы генерируете, если вы хотите использовать другой подход вместо cookie.

Обновление:

  1. Сначала вам нужно ограничить доступ пользователей к вашему приложению на основе IP-адреса, если вы хотите сделать его более безопасным, что может быть достигнуто с помощью crossdomain.xml, ограничивающего пользователей.

  2. Вам нужно рассмотреть возможность шифрования сессии, чтобы даже если пользователь нарушит ее, он не смог ее использовать. Данные должны быть зашифрованы с помощью закрытых ключей и расшифрованы с помощью открытых. Рукопожатие основано на открытых ключах.

0
ответ дан 17 December 2019 в 04:43
поделиться

Посмотрите на метод session_set_save_handler в PHP.

http://php.net/manual/en/function.session-set-save-handler.php

Что ж, чтобы быть фактически верным, несколько компаний используют подход, предусматривающий собственные обработчики сеансов для мультидоменных , распределенная обработка сеанса в памяти / базе данных

1
ответ дан 17 December 2019 в 04:43
поделиться

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

Только одно: убедитесь, что путь, по которому вы сохраняете файлы сессий, недоступен из Интернета. Что-то вроде :

/YourAppFolder
     /www (web accessible)
     / libs
     /config
     / session (where you put your session files)
1
ответ дан 17 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: