реализация проверки состояния AJAX - PullRequest
3 голосов
/ 25 февраля 2011

Я борюсь с условием гонки защитой в PHP.

Мое приложение написано на symfony 1.4, и PHP блокирует данные сеанса до тех пор, пока страница не завершит обработку.У меня есть длительный (~ 10 секунд) сценарий входа в систему, и я хочу отобразить индикатор выполнения, показывающий пользователю, что делается, пока они ждут.(Я хочу на самом деле отобразить то, что делается, и не использовать стандартную полосу загрузки [faux].)

Всякий раз, когда скрипт вызывает session_start(), PHP блокирует данные сеанса этого пользователя до его завершения.Это препятствует тому, чтобы мои ajax-вызовы проверки состояния возвращали что-либо до тех пор, пока не завершится более продолжительный скрипт.(Мой вопрос о том, почему мои ajax-вызовы не были асинхронными, здесь .)

Я разработал способ сделать это, но я хочу убедиться, что этот способ достаточно безопасен для общих целей (т.е. это не банковское приложение).

Моя идея такова:

  1. При аутентификации имени пользователя и пароля (до запуска сценария длительного входа в систему) на клиентском компьютере устанавливается cookie с уникальным идентификатором.
  2. Этот же уникальный идентификатор записывается в файл на сервере вместе с IP-адресом клиента.
  3. Во время выполнения сценария длительного входа в систему этот файл обновляется в соответствии с состоянием процесса входа в систему.
  4. Проверка состояния AJAX пингует сервер на специальной странице, которая не использует session_start().Эта страница получит значение cookie и IP-адрес клиента и проверит файл на стороне сервера на наличие обновлений статуса.

Есть ли какие-либо явно очевидные проблемы с этим решением?

Опять же, с точки зрения безопасности, даже если кто-то взломает это, все, что он получит, это число, представляющее состояние процесса входа в систему.

Ответы [ 2 ]

1 голос
/ 25 февраля 2011

Я не вижу ничего изначально неправильного в предлагаемом вами подходе.

Но если на вашей машине установлено APC , вы можете использовать apc_store и apc_fetch для храненияваш статус в некой разделяемой памяти вместо записи на диск.Используйте что-то вроде apc_store(SID, 'login not started') для инициализации и обновления состояния запроса в памяти, затем apc_fetch(SID) для получения его при последующих запросах.

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

0 голосов
/ 25 января 2013

У меня та же проблема, и я думаю, что уловка session_write_close(), которая освобождает файл сеанса.

Пожалуйста, посмотрите мой https://github.com/jlaso/MySession репозиторий и проверьте, применимо ли это к вашему конкретному вопросу.

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