"35.172.217.40 - 35.172.217.40"

Отладка ошибок случайного недопустимого аутентификатора подлинности

Наш производственный сервер уже несколько месяцев производит недопустимые ошибки токена аутентификации. Ошибки создаются почти во всех формах, отправляющих запросы (PUT | POST | DELETE). Иногда возникает ошибка, иногда они этого не делают. Похоже, что нет рифмы или причины, почему они происходят. Сама ошибка не возникает часто, но это беспокоит нас. Ниже приведен пример типичной формы, которая вызывает эту ошибку.

<form class="button_to" method="post" action="/lesson_progress_trackers/333">  
  <input type="hidden" name="_method" value="patch">
  <input class="finish-lesson-button" type="submit" value="Done!">
  <input type="hidden" name="authenticity_token" value="Qd3FsJZY2UXR9vahuFmaY5rrqA+J5xzGpl4cGI2Vwerx8PZPQtDMugz6oqoe3iviC+/U5zTYPdeX3apwbap09E==">
  <input type="hidden" name="completed" value="true">
</form>

Вот что я обнаружил до сих пор.

  • Мы используем Turbolinks 2.5.3 (мы не обновляем это более года).
  • В каждом случае недопустимой ошибки токена пользователь передал токен аутентификации на сервер, он просто оказался недействительным.
  • В настоящее время мы используем protect_from_forgery with: :exception в нашем контроллере приложений.
  • Ошибки начали появляться, когда несколько месяцев назад мы выпустили кучу нового кода для производства. Этот новый код охватывает сотни файлов, но до сих пор я ничего не нашел в коде, который бы имел отношение к этой проблеме.
  • Ошибка может возникать на любом типе браузера и устройства.
  • Нет никакой корреляции между увеличенным трафиком и недействительными токенами аутентификации.
  • Пользователи могут приехать из любой страны.
  • Это не боты, испытывающие эти проблемы. У нас даже был опыт коллеги по этой ошибке, хотя они не могут вспомнить, что они сделали для ее создания.
  • Пользователи следуют типичным, если не ожидаемым поведением. Они используют приложение, как предполагалось. Я просмотрел их клики и записал историю поведения, чтобы заключить это.

В конечном счете я хочу выяснить, как это решить. Мой первый шаг - успешно воспроизвести ошибку, но я даже не могу этого сделать. Мой вопрос заключается в следующем: что я могу сделать, чтобы помочь мне разобраться в причинах этого? У меня заканчиваются варианты. Спасибо!

+9
источник поделиться
1 ответ

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

  • Убедитесь, что вы вышли из приложения
  • откройте вкладку браузера на странице входа.
  • Пусть он сидит достаточно долго, чтобы истечь токен сеанса /csrf (может быть несколько часов)
  • откройте еще одну вкладку на странице входа и войдите в систему
  • вернитесь к старой вкладке и попробуйте снова войти в систему. Исключено исключение InvalidAuthenticityToken.

Я думаю, что это произошло для меня, потому что две вкладки поделились одним сеансом, сеансом, который был создан при открытии новой вкладки. Однако на старой вкладке все еще был токен csrf из старого сеанса в форме входа. Когда новый файл cookie сеанса и старый токен csrf были отправлены вместе, они не совпадали и, следовательно, ошибка была выбрана.

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

Кстати, я использую devise, но я не думаю, что это специфично для Devise.

+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос