Подтвердить что ты не робот

В чем разница между null_session и reset_session в Rails 4?

В настоящее время я работаю над Rails-приложением с несколькими другими разработчиками, и на сервере AJAX вы можете отправлять POST через Angular. Иногда мы заметили несколько исключений InvalidAuthenticityToken, которые попадают в наши журналы электронной почты, что привело к тому, что мы хотели принять меры.

Поскольку этот запрос проходит через Angular, я считаю, что мы рассматриваем сервер как API, и мы должны использовать protect_from_forgery with: :null_session. Однако protect_from_forgery with: :reset_session, похоже, дает нам такое же разрешение.

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

4b9b3361

Ответ 1

Основываясь на моей интерпретации кода, кажется, что:

  • null_session следует использовать в контроллерах API-интерфейса, где вы не можете использовать для объекта сеанса. Это похоже на подходящее решение для вашего приложения Angular. Предсуществующий сеанс пользователя (т.е. Установленный другими традиционными контроллерами) останется неповрежденным. Это также поведение по умолчанию, если вы не указываете опцию with на protect_from_forgery.
  • reset_session предназначен для традиционных контроллеров. Когда проверка CSRF завершается неудачно, он сообщает Rails о том, чтобы сбить сеанс пользователя и продолжить обработку запроса. Это звучит как "параноидальный режим", в котором вы хотите вывести пользователя из своего приложения, если есть какие-либо доказательства вмешательства в запрос.

Если ваше приложение Rails вообще не использует сеансы, они являются взаимозаменяемыми.

Однако, если вы используете сеансы в некоторых частях вашего приложения, а не другие (т.е. сочетание традиционных и API-контроллеров), то null_session, вероятно, вы должны использовать. В противном случае, если вы используете reset_session, запрос API, сделанный браузером, приведет к тому, что пользователи будут выходить из сеанса браузера.