web-dev-qa-db-ja.com

CSRF保護を考慮して、非常に遅いユーザーにどのように対処できますか?

HTTP POSTを介してデータを送信するすべてのフォームで [〜#〜] csrf [〜#〜] Cookieを使用します。デフォルトでは、有効なセッションを保持しているユーザーが期限切れにならないようにするため、CSRF Coo​​kieはセッションCookieを2時間以上存続させます。有効期限が近づいているセッションをユーザーに通知し、延長できるようにします。

昨日、誰かがログインできないバグの報告を受けました。調査したところ、ユーザーがログインフォームにアクセスしたことがわかりました(送信されるまでセッションは開始されません)実際にフォームを送信する12時間前。これにより、使用しているフレームワークから「このページを表示する権限がない」という不可解なエラーが発生しました。

ユーザーが問題を解決するための対策を講じて悪意のあるものを試さないようにするために、私はそのエラーをより有益なものにするために注意を払いました。

ユーザーが何かをすることができない前に、それを行うために一定の時間しかない状況を処理する適切な方法は何ですか?私が検討していることは、CSRF Coo​​kieの有効期限が切れる(またはトークンが再生成される)の数分前にページを更新し、キーボード/フォーカスイベントが発生した場合にカウントダウンを停止して、ユーザーの再読み込みの隅のケースを防ぐことです彼らがタイプしている間。 JSは、システムを使用できるようにするための要件です。無効にされた状態で対処することは実際的ではありません。

ほとんどのユーザーはCSRFトークンを知らず、気にしないので、これは「典型的な」時限イベントではありません。これは、ユーザーが30秒以内に質問に答えるクイズページのようなものではありません。これはユーザーには決して見えないはずです。

私がこのシナリオに遭遇する最初の人物ではないと確信しているので、それを処理する標準的な方法があるかどうか疑問に思っていますか?

11
Tim Post

JavaScriptが必要なため、Cookieの有効期限が近づいているので、バックグラウンドで小さなAJAX=リクエストを実行して更新しないようにしませんか?ユーザーはそれを知る必要はありません(ただし、ほとんど送信しない場合)データ-モバイルユーザーはデータの許容量を使用して驚かないでください)、更新されたCookieは応答で設定できます。

ページ全体を更新することは、特にページ上に発生したときにクリアされる可能性のあるフォームがある場合、やり過ぎに思われます。

ここにもう少し: http://www.bennadel.com/blog/1995-AJAX-Requests-Get-And-Set-Cookies-Like-Any-Other-HTTP-Request.htm

8
Andrew Leach

あなたの質問であなたが説明する解決策は勝者のように聞こえます。状況の説明に基づいて、ソリューションはユーザーのアクティビティを妨げることなくカウントダウンをリセットする必要があります。したがって、ページを更新し、マウスまたはキーボード入力で一時停止するスクリプトは、問題を修正します。

もう1つの「機能」を追加します。最後の10秒間のカウントダウンをフラッシュメッセージで表示し、最後の瞬間にアクションを実行することに決めたために完了できない場合に備えて、ユーザーに次の更新を通知しますそれ。メッセージは次のようになります。

ログイン許可CookieはX秒で期限切れになります。その後、ページがリロードされます。お待ちください。

一般の人はCSRFを知らないか気にしないので、意図的に「ログイン許可」を使用しました。

3
dnbrv

期限切れのCookieを含むリクエストを受信したら、Cookieを再生成し、エラーを生成するのではなく、まったく同じリクエストを繰り返すターゲットページ発行リダイレクトを実行します。このリクエストにフィールドを追加して、再生リクエストであることを示します。それでも失敗する場合は、ユーザーは実際に再生では解決できない問題を抱えており、エラーを表示する必要があります。これにより、プロセスがユーザーに対して完全に透過的になり、Cookieを更新するために特定のタイミングを必要としません。

1
Oleg V. Volkov