CSRFから保護するための一般的なパターンは、サーバーにランダムなトークンを持つフォームで隠れた入力を生成させることです。サーバーは、フォーム提出時にこのトークンを表示することを想定しています。CSRFとクッキーからフォームへのアプローチ
もう1つの一般的なパターンはcookie-to-headerパターンです。この場合、トークンは(HttpOnly
なしの)クッキーに入れられ、そのトークンは将来の要求からにあり、クッキーとヘッダーの両方がになります。ページのJavascriptはこれを処理することが期待されます。この方法の利点の1つは、サーバーが状態を保持する必要がないことです。もう一つは、GETも安全だということです(もちろん、GETはどうしても状態を変えてはいけません)。
通常、あなたのサイトがSPAであるかどうかによって、どちらかを選択します。しかし、ちょうどだけでなく、いつもは、トークンをクッキーに送信して、ののヘッダーとクッキー内に、またはという形式で、クッキー内にあると思いますか?前者の場合は上記のcookie-to-headerメソッドと同じように動作し、後者の場合はフォームにクライアントのの隠しフィールドが埋め込まれることが期待されます。(javascriptによる)。後者のために必要なのは、ドキュメントの準備ができているJSのちょっとしたスニペットです。これは実装するシステムが1つしかないため(そして状態がないため)、フレームワークを作成する人にとってははるかに簡単です。 Webフレームワークを使用している人にとっては、隠れたフィールドをすべてのフォームに追加することを忘れてはいけないので、はるかに簡単です。そして、GETが世話をしているので、より安全に思えます。
には、クライアントがjavascriptを実行するが必要です)がありますか?私はこのアイデアがどこにでも実装されたり議論されているとは思わなかった。
私はそれを混合ソリューションと呼んでいるかどうかはわかりません。もし何かあれば、人々が通常行うものよりも少ない*混合されたものがあります。フォームには1つのものがあり、XHRにはもう1つのものがあり、攻撃者はそれらの間を選ぶことができます。 – user2141650
これはおもしろい点ですが、異なる実装ではリスクが異なりますが、特定のリスクには1つのセットしか当てはまらないという意味で、リスクは異なります。あなたは正しいですが、長期的には(そして、例えば、多くの開発者がいる大規模な組織では)、開発者に何かカスタムを選択させたり実装させたりする代わりに、検証済みのソリューションを1つ持つことは有益かもしれません。 –