Я борюсь с условием гонки защитой в PHP.
Мое приложение написано на symfony 1.4, и PHP блокирует данные сеанса до тех пор, пока страница не завершит обработку.У меня есть длительный (~ 10 секунд) сценарий входа в систему, и я хочу отобразить индикатор выполнения, показывающий пользователю, что делается, пока они ждут.(Я хочу на самом деле отобразить то, что делается, и не использовать стандартную полосу загрузки [faux].)
Всякий раз, когда скрипт вызывает session_start()
, PHP блокирует данные сеанса этого пользователя до его завершения.Это препятствует тому, чтобы мои ajax-вызовы проверки состояния возвращали что-либо до тех пор, пока не завершится более продолжительный скрипт.(Мой вопрос о том, почему мои ajax-вызовы не были асинхронными, здесь .)
Я разработал способ сделать это, но я хочу убедиться, что этот способ достаточно безопасен для общих целей (т.е. это не банковское приложение).
Моя идея такова:
- При аутентификации имени пользователя и пароля (до запуска сценария длительного входа в систему) на клиентском компьютере устанавливается cookie с уникальным идентификатором.
- Этот же уникальный идентификатор записывается в файл на сервере вместе с IP-адресом клиента.
- Во время выполнения сценария длительного входа в систему этот файл обновляется в соответствии с состоянием процесса входа в систему.
- Проверка состояния AJAX пингует сервер на специальной странице, которая не использует
session_start()
.Эта страница получит значение cookie и IP-адрес клиента и проверит файл на стороне сервера на наличие обновлений статуса.
Есть ли какие-либо явно очевидные проблемы с этим решением?
Опять же, с точки зрения безопасности, даже если кто-то взломает это, все, что он получит, это число, представляющее состояние процесса входа в систему.