Токен подлинности 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]">

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

Фактически это означает, что теги head бесполезны, не так ли? Я могу переписать тег ввода формы в значение в моем файле 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

person SnakeWasTheNameTheyGaveMe    schedule 25.04.2016    source источник


Ответы (1)


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

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

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

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

person SnakeWasTheNameTheyGaveMe    schedule 30.06.2016