2016-09-04 12 views
0

CSRFから保護するための一般的なパターンは、サーバーにランダムなトークンを持つフォームで隠れた入力を生成させることです。サーバーは、フォーム提出時にこのトークンを表示することを想定しています。CSRFとクッキーからフォームへのアプローチ

もう1つの一般的なパターンはcookie-to-headerパターンです。この場合、トークンは(HttpOnlyなしの)クッキーに入れられ、そのトークンは将来の要求からにあり、クッキーとヘッダーの両方がになります。ページのJavascriptはこれを処理することが期待されます。この方法の利点の1つは、サーバーが状態を保持する必要がないことです。もう一つは、GETも安全だということです(もちろん、GETはどうしても状態を変えてはいけません)。

通常、あなたのサイトがSPAであるかどうかによって、どちらかを選択します。しかし、ちょうどだけでなく、いつもは、トークンをクッキーに送信して、のヘッダーとクッキー内に、またはという形式で、クッキー内にあると思いますか?前者の場合は上記のcookie-to-headerメソッドと同じように動作し、後者の場合はフォームにクライアントのの隠しフィールドが埋め込まれることが期待されます。(javascriptによる)。後者のために必要なのは、ドキュメントの準備ができているJSのちょっとしたスニペットです。これは実装するシステムが1つしかないため(そして状態がないため)、フレームワークを作成する人にとってははるかに簡単です。 Webフレームワークを使用している人にとっては、隠れたフィールドをすべてのフォームに追加することを忘れてはいけないので、はるかに簡単です。そして、GETが世話をしているので、より安全に思えます。

には、クライアントがjavascriptを実行するが必要です)がありますか?私はこのアイデアがどこにでも実装されたり議論されているとは思わなかった。

答えて

1

まず、GET要求をCSRFから保護することはほとんどありません.GETは状態を変更すべきではなく、無害でなければならないことに注意してください。 CSRFによるGET要求への攻撃は単純なリンクで取り除くことができますが、それは何らかの保護が必要な場合には非常に特殊なケースです(しかし、依然として要求によっては可能かもしれません)。

それ以外にも、良いソリューションを混在させることができます。その可能性が高いほど、攻撃面が広がり、複雑さも増します。リスクは受け入れる可能性があります。

お互いに比較するパラメータとセキュリティの基礎となるものを慎重に検討する必要があります。サーバーによって生成され、フォームに書き込まれたトークンのセキュリティは、ユーザーが他のユーザーのセッションの内容を直接読み取ることができないというサーバー側のセッションのセキュリティに基づいています。これはかなり確かな前提です。 cookie-to-headerメソッドのセキュリティは、ブラウザが攻撃者のWebサイトにアプリケーションドメインに設定されたCookieを読み取らせないという事実に基づいています。これははるかに弱く、任意のブラウザにバグがあり、インストールされているエクステンションなどがありますが、引き続き受け入れられますが、リスクプロファイルは異なります。 両方のソリューションを実装するということは、両方のリスクをとることを意味します。

また、ソリューションが混在している場合、実装エラー(複雑性の増加)によって誤ったものを比較するリスクがあります。たとえば、クッキー値とサーバー側セッションに格納された値とを比較すると、明らかにその効果は無効になります。クッキーは攻撃者のサイトからの要求と共に送信されます。

+0

私はそれを混合ソリューションと呼んでいるかどうかはわかりません。もし何かあれば、人々が通常行うものよりも少ない*混合されたものがあります。フォームには1つのものがあり、XHRにはもう1つのものがあり、攻撃者はそれらの間を選ぶことができます。 – user2141650

+0

これはおもしろい点ですが、異なる実装ではリスクが異なりますが、特定のリスクには1つのセットしか当てはまらないという意味で、リスクは異なります。あなたは正しいですが、長期的には(そして、例えば、多くの開発者がいる大規模な組織では)、開発者に何かカスタムを選択させたり実装させたりする代わりに、検証済みのソリューションを1つ持つことは有益かもしれません。 –