я работаю с сессиями в PHP, и у меня есть различные приложения на единственном домене. Проблема, что cookie являются зависящими от домена, и таким образом, идентификаторы сессии отправляются в любую страницу на единственном домене. (я не знаю, существует ли способ заставить cookie работать другим способом). Таким образом, Переменные сеанса видимы на каждой странице на этом домене. Я пытаюсь реализовать пользовательский менеджер сеансов для преодоления этого поведения, но я не уверен, думаю ли я об этом право.
Я хочу полностью избежать системы сессии PHP и сделать глобальный объект, который хранил бы данные сессии, и на конце сценария сохраняют его к базе данных.
Та переменная сеанса была бы реализована как одиночный элемент (я знаю, что получил бы плотное соединение с этим классом, но я не знаю о лучшем решении).
Я пытаюсь извлечь следующую пользу:
я не уверен, пропускаю ли я какие-либо недостатки этого решения. Есть ли какой-либо лучший путь?
Спасибо!!
ОБНОВЛЕНИЕ: я не объяснил это достаточно подробно и вызвал много беспорядка здесь, таким образом, я хочу сделать более ясным, с чем я имею дело:
Я создаю серверное приложение SOA, которое было бы развернуто во многих различных средах. Это не будет иметь своего собственного веб-сервера, таким образом, в тех средах мог быть другой приложения PHP. У сотрудников этих компаний будут учетные записи пользователей в этом приложении, таким образом, они получат cookie с идентификатором сессии в это приложение.
Как мы знаем, веб-сервер, выполняющий PHP, когда загрузка данных сессии не имеет значения (по крайней мере по умолчанию), какой сценарий, из которого каталог создал сессию. Все, в чем требуется, является идентификатором сессии. Этот идентификатор сессии отправляется с каждым запросом от клиента к серверу. Из Ваших ответов я получил путь, как PHP мог ограничить cookie для определенного каталога, но злонамеренный пользователь может отредактировать cookie, потому что он хранится в его компьютере. У злонамеренного пользователя в моем случае может быть доступ, чтобы записать и выполнить сценарий PHP в той же среде, хотя не имея доступ к моему приложению, и это - база данных. Если он создает сценарий, он мог бы использовать идентификатор Сессии от cookie моего приложения, таким образом у него есть доступ в чтение и данные сеанса редактирования по моему приложению, и получите доступ к частям моего приложения, которому его нельзя разрешить.
Я вижу, что будет другой угрозы нарушения безопасности в развертывающемся приложении в такой среде, для чего я иду, лучшая изоляция, которую я мог сделать, и обработка сессии по умолчанию кажется слишком опасной и не разработанная для использования как это.
Таким образом, мой вопрос, если Вы видите что-то, которое менее безопасно, менее гибко в моем дизайне, чем это было бы с управлением сеансами по умолчанию..
Спасибо за Ваши ответы..
Вам нужно использовать:
session_set_cookie_params()
http://www.php.net/manual/en/function.session-set-cookie-params.php
В частности, вам нужно установить "путь" в каждом из ваших webapp.
Вот что вы можете узнать:
abcd.php? php echo session_name (); ?> = php echo session_id (); ?> & domain =
я не уверен, не упускаю ли я из виду какие-либо недостатки этого решения. Есть ли способ лучше?
это очень сложно - и не сработает, например 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
Я хочу полностью избежать системы сессий PHP, и сделать глобальный объект, который будет хранить данные сессии и в конце скрипта сохранять их в базу данных.
Если вы думаете о сериализации ваших объектов, я не рекомендую, так как это не очень хорошая практика для хранения безопасных данных.
http://www.php.net/manual/en/function.session-set-save-handler.php#81761
Посмотрите на приведенный выше пример, он дает хорошее решение.
Поддержание состояния в разных доменах.
Обновление:
Сначала вам нужно ограничить доступ пользователей к вашему приложению на основе IP-адреса, если вы хотите сделать его более безопасным, что может быть достигнуто с помощью crossdomain.xml, ограничивающего пользователей.
Вам нужно рассмотреть возможность шифрования сессии, чтобы даже если пользователь нарушит ее, он не смог ее использовать. Данные должны быть зашифрованы с помощью закрытых ключей и расшифрованы с помощью открытых. Рукопожатие основано на открытых ключах.
Посмотрите на метод session_set_save_handler
в PHP.
http://php.net/manual/en/function.session-set-save-handler.php
Что ж, чтобы быть фактически верным, несколько компаний используют подход, предусматривающий собственные обработчики сеансов для мультидоменных , распределенная обработка сеанса в памяти / базе данных
Если вы не хотите иметь проблем с общими сессиями, вы можете использовать функцию session_save_path, чтобы задать путь, где ваше приложение будет сохранять свои файлы сессий. Поскольку этот путь не будет использоваться другими приложениями на сервере, вы не столкнетесь с проблемами разделения сессий.
Только одно: убедитесь, что путь, по которому вы сохраняете файлы сессий, недоступен из Интернета. Что-то вроде :
/YourAppFolder
/www (web accessible)
/ libs
/config
/ session (where you put your session files)