2016-05-24 15 views
2

私はRailsアプリケーション(バージョン4.2.5)で、インターネットに接続できないときにユーザーが記入できるフォームをキャッシュするためにラックオフラインの宝石を使用しています後でユーザが接続しているときに提出できるlocalStorageオブジェクトとして格納されます)。それはレンダリング - フォームが送信されたときしかし、私はRailsのサーバの電源がオフの間、新しいブラウザウィンドウを開き、ページがキャッシュされている(http://localhost:3000/entries/newに移動したときにこれが発生するエラーRails - キャッシュされたフォームの無効な認証トークンエラー

ActionController::InvalidAuthenticityToken in EntriesController#create

を取得していますちょうど良い)、フォームを記入してから、サーバーを再度オンにして提出してください。

def create 
    @entry = Entry.create(entry_params) 
    redirect_to "http://localhost:3000/entries" 
end 

とアプリケーション・コントローラ:私のエントリーコントローラから

class ApplicationController < ActionController::Base 
    protect_from_forgery with: :exception 
end 

そして、私のレイアウトでビューが<%= csrf_meta_tags %>

を含んで、私はこの問題を回避することができます任意の方法があります。アプリのセキュリティを損なうことなく問題を解決できますか?アプリケーションコントローラで

EDIT、Iは

protect_from_forgery with: :null_session 

protect_from_forgery with: :exception 

を交換し、これが問題を解決しました。しかし、これがセキュリティ上の脆弱性を引き起こすかどうかを理解するためには、これが何を意味するのか十分に分かりません。それは? (PS - 本当にセキュリティ上の脆弱性を避けたい)

答えて

2

csrf_meta_tagsは、JavaScriptを使用するのに十分なスマートなJavaScriptがあれば、ajaxフォームの送信に便利です。そうしないと、あなたのフォームにトークンを使用して、通常のフォームフィールドを配置する必要があります:あなたは何とか真正トークンを含めずにフォームを構築している場合している場合

<%= hidden_field_tag :authenticity_token, form_authenticity_token %> 

これはおそらくあなたの問題を解決します。ここで

は、他のいくつかのアイデアです:

  1. チェックが真正トークンが実際にHTTP交換
  2. フォームを務めたサーバーを確実に検査することで、サーバーに送信されていることを確認することと同じです(または少なくともサーバー間でsecret_key_baseが一致するもの)
  3. フォームを取得するために使用したセッションCookieが、フォームの送信時に失われていないか期限切れでないことを確認します。
  4. Cookieについては、make確かに送信するセッションCookieは、フォームを要求したときに取得したものとまったく同じものです。私は、複数の異なるドメインフィールドが設定された同じ名前のCookieが複数ある場合、これが起こるのを見ました。すべてをクリアして、最後までに何が終わるかを見ることができます。
+0

ありがとう - 私はこれを試しましたが、それは私にエラー 'ActionController :: InvalidAuthenticityToken'を与えました。私は誰かが他の場所で推薦しているのを見た、<%= hidden_​​field_tag "authenticity_token"、form_authenticity_token%>を試みました - 同じ結果。私は何を見落としているでしょうか? – skwidbreth

+0

私はこれが間違っているのを見たところで私が考えることができる他のすべてについてちょうど追加しました。 –

+0

ありがとうございます - 私はこれで作業し、私が思いつくことができるものを見ていきます。 – skwidbreth