web-dev-qa-db-ja.com

CSRF保護-「バックページ」

[〜#〜] owasp [〜#〜] は、CSRF保護を実装するときに、この前のページとの対話によってCSRFの誤検知が発生するため、ブラウザで「戻る」を試みると問題が発生することを示しています。サーバーでのセキュリティイベント。

私はあなたが反撃するとすぐにセッションを破壊することによってオンライン銀行がこれを処理するのを見ました、しかし私はこれを回避する他の方法があるかどうか疑問に思いますか?理想的には、セッションを維持したいのですが、ユーザーをフロントページ(ログオン後に表示される)にリダイレクトするだけですが、それが安全な方法かどうかはわかりません。

これはおそらくWebアプリケーションで一般的な問題ですが、どのようなオプションがありますか?

ありがとう

6
NULLZ

シンクロナイザートークンパターンを適切なナビゲーション/マルチタブサポートと一緒に使用することは完全に可能です。それはあなたが疑わしいアドバイスをした場合のみです:

この提案された設計のセキュリティをさらに強化するには、各リクエストのCSRFトークンパラメータ名または値をランダム化することを検討してください

あなたが問題を抱えていること。実際には、すべてリクエストでこれを行う正当な理由はありません。

セッションが認証を昇格する時点でCSRFトークンを循環させることには、通常、ログイン状態を変更するログインおよびその他のパス(登録、アカウントの回復、ユーザーの切り替えなど)でのみメリットがあります。これらは、セッションIDも循環させる必要があるポイントであるため、両方を同時に実行することは理にかなっています。セッションIDを変更すると、セッション固定によるセッションハイジャックが防止されます。 CSRFトークンを変更すると、セッション固定によるCSRF攻撃が防止されます。

ログアウト状態または以前のログイン状態でキャッシュされたページに戻って(または別のタブで開いたままにして)何かをしようとすると、実際に壊れますが、ほとんどの人はおそらくその時点でそれが機能することを期待していません。

必要に応じて、JavaScriptを挿入してその状況を検出し、セッションCookieがページ作成時に使用されたものと一致することを確認できます。 (または、識別子ではなく、必要に応じてhttponlyでもない関連するCookie。)次に、一致しない場合は、警告divを追加してページにリンクを再読み込みするか、防止することができます。ページ上のアクティブなフォームコントロールが応答しないようにします。キャッシュを許可している場合は、そのチェックonloadに加えて、bfcacheのonpageviewを実行し、場合によってはポーラーでマルチタブのケースをキャッチします。 (これは、クライアント側でセッションタイムアウトをキャッチし、よりわかりやすいエラーを表示する場合にも役立ちます。)

5
bobince