2016-04-25 1 views
6

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

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

1) В голове

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

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

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

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

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

ответ

2

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

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

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

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

Смежные вопросы