Yii 1.1: Состояние гонки при чтении $ _COOKIE, используемое для идентификации пользователя - PullRequest
1 голос
/ 18 октября 2019

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

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

  • Сеансы хранятся в базе данных, на самом деле я не использую $ _SESSION для хранения чего-либо.
  • Сгенерированный сеансИдентификатор хранится в файле cookie и заполняет $ _COOKIE, который используется PHP для подключения пользователя к его данным.
  • На странице входа я сохраняю идентификатор сеанса из файла cookie в поле формы.
  • Пользователь входит в систему, ввод проверяется, данные сеанса создаются и сохраняются вместе с записью пользователя, включая идентификатор сеанса из формы (настоящий идентификатор сеанса). Затем пользователь направляется через еще 2 контроллера (LoginCheck, Dashboard) для приземления на панель мониторинга.
  • Во время сеанса пользователь часто возвращается на панель мониторинга.
  • Когда 2 или более пользователейПолучите доступ к странице панели инструментов (почти) одновременно (посредством входа в систему или возврата со страницы на сайте), и оба пользователя получат одинаковый идентификатор cookie и данные сеанса. Я могу подтвердить это, проверив cookie на основе браузера с помощью значения cookie, хранящегося в переменной $ _COOKIE. Простое обновление панели инструментов на странице с неверными данными приводит к загрузке правильных данных.

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

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

Любой советбудет принята с благодарностью.

Ура

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Я думаю, вы ловите оптимистическую блокировку БД. Простой способ разрешить это - использовать транзакции, но CDbHttpSession не использовать его (благодаря MySql myisam). Если это так, вам нужно изменить класс CDbHttpSession или оптимизировать свою БД.

Чтобы выяснить, в чем именно заключается проблема, необходимо использовать отладку. Для воспроизведения ошибки используйте некоторые "Многопоточность »CURL клиента, например , жрет и создает несколько одновременных запросов на странице входа. Установите точки останова в CDbHttpSession и узнайте, что происходит

Если вы используете PhpStorm:

  1. Руководство по отладке

  2. В запросе CURL необходимо указать XDEBUG_SESSION=PHPSTORM cookie

0 голосов
/ 18 октября 2019

Вы можете использовать fopen с флагом x или x + для общего файла. Только один из экземпляров может открыть файл одновременно.

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

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

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

...