как реализовать расширенную обработку сессий в PHP - PullRequest
6 голосов
/ 10 мая 2010

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

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

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

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

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

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

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

Спасибо !!

UPDATE: я не объяснил это достаточно подробно и вызвал здесь много недоразумений, поэтому хочу прояснить, с чем имею дело:

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

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

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

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

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

Ответы [ 6 ]

2 голосов
/ 10 мая 2010

Вам необходимо использовать:

session_set_cookie_params ()

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

В частности, вам необходимо установить «путь» в каждом из ваших веб-приложений.

1 голос
/ 11 мая 2010

Вот что вы можете посмотреть:

  • Установите идентификатор сеанса и путь к домену. Если доменом является .mastergaurav.com, файлы cookie будут отправлены обратно на mastergaurav.com, www.mastergaurav.com, blogs.mastergaurav.com и т. Д.
  • Может быть, вместо использования идентификатора сеанса в качестве файла cookie - если вам действительно нужно обойти несколько доменов TLD - сделайте его частью URL для полностью настраиваемой реализации:
    abcd.php?<?php echo session_name(); ?>=<?php echo session_id(); ?>&domain=<your-domain>
1 голос
/ 10 мая 2010

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

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

/YourAppFolder
     /www (web accessible)
     / libs
     /config
     / session (where you put your session files)
1 голос
/ 10 мая 2010

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

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

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

0 голосов
/ 10 мая 2010

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

это очень сложно - и не будет работать, например 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 голосов
/ 10 мая 2010

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

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

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

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

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

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

Обновление:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...