Будет ли PHP-код приложения всегда иметь права на чтение / удаление файлов сеанса на одном и том же сервере? - PullRequest
0 голосов
/ 01 ноября 2018

Для моей Joomla! Расширение 3.8+ Мне нужно иметь возможность находить и удалять (отменять связь) файлы сеансов PHP (называемые «sess_» + идентификатор сеанса), которые будут храниться в session_save_path, например, / TMP. Я понимаю, что именно PHP хранит файлы сессий, то есть не Joomla! (Обработчик сессии Joomla! Установлен на «PHP») Мой вопрос: будет ли файл сеанса PHP, созданный с помощью Joomla! веб-сайт ВСЕГДА будет доступен для чтения / записи через PHP-код моего расширения, который является частью того же Joomla! установить?

Дополнение: позже я понял, что в своем вопросе я опустил слово «всегда», которое я сейчас добавил.

Дополнение: более подробное объяснение того, чего я пытаюсь достичь. Как я уже сказал, у меня есть Joomla! сайт, на котором пользователи могут войти. Вопрос касается ТОЛЬКО когда Joomla! настроен с обработчиком сеанса, установленным на «PHP» (вместо «базы данных») Когда Session Handler - это «база данных», проблем нет.

В общих чертах я хочу добиться следующего (с обработчиком сеанса Joomla!, Установленным на 'PHP'):

1> Пользователь открывает браузер A и заходит на сайт, а Joomla! записывает связанный идентификатор сеанса плюс идентификатор пользователя в базу данных.

2> Один и тот же пользователь открывает другой браузер B (возможно, с другим IP) и хочет зайти на тот же сайт.

3> Поскольку пользователь уже зашел на сайт через браузер A, он / она не имеет права войти в систему снова и будет представлен кликабельная ссылка, которая уничтожит все остальные его сеансы, включая один с браузером A (мы записали идентификаторы сеанса всех остальных сеансы).

Простая session_destroy () на шаге 3 только частично делает свое дело, потому что детали разрушенного сеанса вновь появляются через некоторое время в Joomla! бэкэнд, а также в Joomla! сессионный стол. Хотя это не мешает Joomla! передний конец, это не чисто, и я хочу избежать этого, чтобы сделать его дураком. Безусловно, лучшим решением было бы, если бы я мог удалить файл сеанса PHP (например, в dir / tmp и с именем 'sess _....'). Я проверил это, и он работал нормально. Однако ... он полагается на то, что у вас всегда есть доступ для удаления к файлу сеанса PHP (с использованием session_save_path () и unlink ($ session_file_path)), и это основа вопроса, который я написал. Я обнаружил, что удаление файла сеанса PHP не всегда возможно; это зависит от конфигурации PHP провидора. Поскольку я разрабатываю это коммерческое приложение, процесс должен работать со всеми конфигами, включая те, которые не разрешают удалять доступ к файлу сеанса.

Я продолжу поиск решения и опубликую его здесь, когда найду.

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Спасибо @Nigel и @ AgeDeO

Методом проб и ошибок я обнаружил, что ответ НЕТ, не всегда. Выполнив код с несколькими коммерческими провайдерами, я столкнулся с одним провайдером, который не позволил мне удалить файл сеанса PHP, пока он находился в его расположении по умолчанию. Место было /var/lib/php5.

0 голосов
/ 04 ноября 2018

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

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

Лучшим решением было бы иметь вторичную таблицу недействительные идентификаторы сеанса .

Затем вы пишете пользовательский плагин, перехватывающий события onUserAuthorization и onUserLogout. Вам тоже понадобится onAfterInitialise.

Эта ловушка будет проверять при инициализации, был ли текущий идентификатор сеанса признан недействительным; если это так, немедленный выход из системы запускается. В противном случае его временная метка обновляется.

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

При новом входе в систему выдается предупреждение об открытии других сеансов: в случае успешного входа все остальные сеансы для того же пользователя будут помечены как недействительные.

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

0 голосов
/ 01 ноября 2018

Это зависит от настроек сервера.

  1. Найти пользователя, который использует PHP: Как проверить, какой пользователь запускает php?

  2. Проверьте разрешения этого пользователя в папке, где хранятся сеансы: Unix: Как проверить разрешения для определенного каталога?

  3. При необходимости измените права доступа: https://serverfault.com/questions/105535/how-can-i-set-full-premissions-to-a-user-in-a-specified-dir

...