ブラウザが開いている限りセッションを開いたままにしておくことに反対するのは、自動化された攻撃の問題のようです。残念ながら、ページの読み込みごとにトークンを更新すると、ほとんどのアマチュア攻撃者を阻止するだけです。
まず、私たちはあなたのサイトを特に標的とした攻撃について話していると思います。 (歩き回ってさまざまなフォームを送信するボットについて話している場合、これはボットを停止させないだけでなく、はるかに優れた簡単な方法があります。)その場合、私はサイト、これが私のボットが行うことです:
- フォームページを読み込みます。
- フォームページでトークンを読み取ります。
- そのトークンを使用して自動リクエストを送信します。
- 手順1に進みます。
(または、システムを十分に調査した場合、各リクエストに「this is AJAX」ヘッダーを含めると、1つのトークンを永久に保持できることに気付きます。または、トークンが私のセッションIDであることに気付きます。自分のPHPSESSID
を送信する クッキー。)
ページの読み込みごとにトークンを変更するこの方法では、実際に望んでいた人を止めることはできません。 あなたをひどく攻撃します。したがって、トークンは自動化に影響を与えないため、CSRFへの影響に注目してください。
CSRFをブロックするという観点からは、1つのトークンを作成し、ユーザーがブラウザーを閉じるまでそれを維持することは、すべての目標を達成しているように見えます。単純なCSRF攻撃は無効になり、ユーザーは複数のタブを開くことができます。
TL; DR:リクエストごとにトークンを1回更新しても、セキュリティは向上しません。使いやすさを追求し、セッションごとに1つのトークンを実行します。
でも!偶発的またはその他の方法でフォームの重複送信が非常に心配な場合でも、この問題は簡単に解決できます。答えは簡単です。2つの異なるジョブに2つのトークンを使用します。
最初のトークンは、ブラウザセッションが終了するまで同じままです。このトークンは、CSRF攻撃を防ぐために存在します。このトークンを使用したこのユーザーからの送信はすべて受け入れられます。
2番目のトークンは、ロードされたフォームごとに一意に生成され、開いているフォームトークンのユーザーのセッションデータのリストに格納されます。このトークンは一意であり、使用されると無効になります。このトークンを使用したこのユーザーからの送信は、1回だけ受け付けられます。
このように、フォームAのタブとフォームBのタブを開くと、それぞれに個人のアンチCSRFトークン(CSRFが処理)と1回限りのフォームトークン(フォームの再送信が処理)があります。どちらの問題も、ユーザーエクスペリエンスに悪影響を与えることなく解決されています。
もちろん、このような単純な機能を実装するには多すぎると判断するかもしれません。とにかくそうだと思います。とにかく、必要に応じて固溶体が存在します。