Rails アプリでエンドポイントの CSRF トークン チェックを無効にできれば、より優れたユーザー エクスペリエンスを提供できる状況に陥っています。
エンドポイントは、 deviseフィルターの背後にあるcreate
( によってルーティングされる) アクションです。POST /whatever
:authenticate!
before_filter
その特定のエンドポイントの CSRF 保護を無効にすることで、追加のセキュリティ リスクにさらされることになるでしょうか。それとも、CSRF トークンが保護する種類の悪意のある要求を停止するために、認証に安全に頼ることができるでしょうか?
以下は、誰かが興味を持っている場合になぜこれをやりたいのかについて、もう少し詳細な説明です。
私の使用例は、基本的に Facebook のいいねボタンに非常に似たものを作成したいということですが、このボタンは (Facebook の同等のボタンとは異なり) 通常、同じページに複数回表示されます。
CSRF 保護は、ユーザーが空の Cookie を使用してページにアクセスした場合を除いて、正常に機能します。
この場合、Rails は X 個のリクエストごとに新しいセッションを生成します。これらはすべて Cookie を使用しないためです。そしてもちろん、新しいセッションごとに新しい CSRF トークンが生成され、iframe への応答で返されます。
ブラウザーはドメインに対して 1 つの Cookie のみを保持するため、各 iframe からの後続の要求はすべて同じセッションにマップされ、すべての CSRF トークン (1 つを除く) が無効になります。
ユーザーは一度ログインするように求められ、その後ボタンを押すたびに同じログインにマッピングされるため、単一のセッションへのマッピングは便利です。ページをリロードする必要はありません。
妥協案は で応答すること401 Unauthorized
ですが、拒否されたリクエストのセッションを保持します ( をオーバーライドすることによりhandle_unverified_request
)。これにより、サインイン ポップアップが再度トリガーされますが、今回は、ユーザーが既にサインインしているため、インスタント リダイレクトが発生します。
create
もちろん、サインインポップアップウィンドウの点滅を避けるのが最善であるため、CSRF保護をアクションだけですべて無効にしたいと思います。