7

Railsアプリケーションでは、ユーザーが一度に複数のブラウザータブを数時間または数日間開いたままにしておくのが一般的です。この問題は、これらのタブの1つで、ユーザーがログアウトしてから再度ログインした場合に発生します(または、セッションが期限切れになり、新しいセッションが作成されます)。

これにより、他のすべてのタブのCSRF認証トークンが無効になります。更新せずにフォームを送信したり、これらのタブでajaxリクエストを実行しようとすると、エラーが発生します(実際、不正な認証トークンが渡された場合のデフォルトのRailsの動作であるため、ログアウトされます)。

この動作は明らかに望ましくありません。ユーザーがサイトに対してウィンドウを開いているが、信頼性トークンが古くなっている状況を適切に処理するために、人々は何をするのだろうかと思っていました。

私がやりたくないのは、ログインページにリダイレクトすることです。たとえば、長いブログ投稿などを書いていると、作業が失われる可能性があります。

頭に浮かぶ解決策は、サーバーをポーリングして信頼性トークンが変更されたかどうかを確認するか、ユーザーのCookieをポーリングしてセッションが変更されたかどうかを確認するJavaScriptを用意することです。誰かがこれらのいずれかをしているのを聞いたことがないので、コミュニティがどう思っているかを見たかったのです。

4

2 に答える 2

3

まず、ログイン/ログアウト/ログインしても、新しいcsrfトークンは表示されません。それはまだユーザーのクッキーに保存されます。次回同じブラウザでログインすると、同じトークンが取得されます。

Railsの最新バージョンでは、トークンが正しくない場合でもエラーはスローされません。すべてのRailsは、セッションをリセットしてからコントローラーに渡します。

したがって、Railsを更新すると、痛みが1つ少なくなります。

于 2012-05-04T19:03:54.780 に答える
3

セッショントークンではなく、CSRFトークンについて話しているのですか?CSRFトークンの不一致でログインにリダイレクトすることはまったく意味がありません。ユーザーに、彼がやろうとしたことを何でも繰り返すように指示するだけです。(従来のWebアプリケーションでは、これは通常、フォームが送信されたときに発生します。CSRFの不一致を検証エラーとして扱い、すべてのフィールド値を保持してフォームを再度表示し、ユーザーに再送信を求めることができます。より多くのAJAXで-重いアプリケーションでは、応答である種の一般的なCSRFフラグを使用できます。フラグが設定されている場合は、ユーザーにもう一度何でもするように依頼するか(ボタンを押すなど)、ユーザーに迷惑をかけずにすべてを自動化することもできます。

于 2012-05-04T19:07:50.183 に答える