Тольк аутентификации Rails 4 - как в заголовке, так и в виде скрытого ввода?

Я пытаюсь получить полное кэширование страниц в Rails, но я попал в большую уязвимость в отношении CSRF - или, может быть, просто из-за моего понимания этого. В настоящее время у меня есть строка form_authenticity_token, хранящаяся в файле cookie, который JS может получать и переписывать теги заголовков с помощью.

Есть два места, где я нахожу маркеры в моем сгенерированном HTML:

1) В голове

<meta name="csrf-token" content="[hash]">

2) Внутри скрытого элемента ввода

<input type="hidden" name="authenticity_token" value="[different hash]">

Как указано, эти хэши отличаются друг от друга (в режиме разработки, когда кеширование не включено). Почему они разные? Почему я могу удалить метатеги заголовков и оставить ввод формы в одиночку, и запрос разрешен? Но когда я удаляю тег ввода формы и оставляю заголовки, запрос отклоняется?

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

Контроллер приложений содержит:

protect_from_forgery with: :exception
before_filter :csrf_cookie

def csrf_cookie
  cookies['authenticity-token'.freeze] = {
    value: form_authenticity_token,
    expires: 1.day.from_now,
    secure: (Rails.env.staging? || Rails.env.production?)
  }
end
+6
источник поделиться
1 ответ

Просмотр SO на другой проблеме привел меня к ответу. Короче говоря, Rails помогает пользователям jQuery, вставляя токен CSRF в запросы ajax автоматически. Он ищет его в метатегах.

Таким образом, наличие токена CSRF внутри формы полезно при отправке запросов POST и использовании его в голове полезно для экономии времени/усилий/ошибок с помощью ajax-запросов.

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

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

+2
источник

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