2016-04-25 8 views
6

私はRailsでフルページキャッシュを取得しようとしていますが、私はCSRFに関して多大な悩みを抱えています。私は現在、form_authenticity_tokenという文字列をJSがアクセスしてヘッダタグを書き換えることができるクッキーに格納しています。Rails 4認証トークン - ヘッダーとフォームの両方に隠れた入力?

私は、生成されたHTML内のトークンを見つける2ヶ所あります。フォームの隠されたinput要素の内側ヘッド

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

2)では

1)

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

示されているように、これらのハッシュは互いに異なっています(キャッシュがenablでない開発モードで) ed)。彼らはなぜ異なっているのですか?なぜ私は頭のメタタグを削除し、フォーム入力だけを残してリクエストが許可されるのですか?しかし、フォームの入力タグを削除してヘッダを残すと、リクエストは拒否されますか?

効果的には、これはヘッドタグが役に立たないという意味ですか?ヘッダータグと同じように、フォーム入力タグを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

別の問題led me to the answerにSO閲覧します。簡単に言えば、RailsはajaxリクエストにCSRFトークンを自動的に挿入することでjQueryユーザーを支援します。それはメタタグでそれを探します。

フォーム内にCSRFトークンを入れると、POSTリクエストを送信して頭に入れておくと、ajaxリクエストで時間/労力/ミスを減らすのに便利です。

おそらく、フォームが存在しないときにajaxリクエストを行いたいと思うかもしれないので、両方で持っていると良いでしょう。フォームがあり、javascriptが無効になっている場合は、ヘッダーにPOSTリクエストに含まれないので、誰も好きではありません。

なぜ異なっているのですか?私はそれが世代の時にアルゴリズムと関係があると推測することしかできませんが、両方のトークンが動作するのでここにもそこにはありません。

関連する問題