web-dev-qa-db-ja.com

CSRFオリジンとリファラーヘッダーはホストをチェックするだけですか?

注:この質問は、リンクされた可能な重複と同じではありません。その質問はhowに尋ねます。Origin/ refererヘッダーをチェックすると、CSRFから保護されます。この質問は、具体的な詳細を実装する方法を尋ねています。

REST APIの場合、CSRFから保護する場所がたくさんあります。リファラーとOriginヘッダーを確認する必要があります。しかし、その詳細を説明する人は誰もいないようです。ホストは同じですか?スキームもチェックする必要がありますか?

1
srchulo

リファラーとOriginヘッダーをチェックすることが最善の防御であるという前提に同意するかどうかはわかりません。まれに、これらのヘッダーの両方が欠落する場合があります。これらの場合、安全な唯一のオプションはリクエストをブロックすることです。これは少数の正当なユーザーの機能を破壊する可能性があります。

これがあなたがしたいパスである場合、 OWASPには技術に関する多くの優れた情報があります

  • Originヘッダーから開始し、それがない場合は、refererヘッダーを使用します。
  • 繰り返しますが、これらのいずれも存在しない場合は、ブロックする必要があります。
  • URLの比較:は単純に見えるかもしれませんが、実際には非常にトリッキーなことです。比較が適切であることを確認してください。 good.com.evil.comgood.comとして渡されません。これはほんの一例であり、間違いなくもっと多くの落とし穴があると思います。このタスクには、十分にテストされた適切なライブラリを使用することをお勧めします。
  • スキームがhttp://またはhttps://であることを確認することはおそらく良いことです。このチェックが行われていない場合に使用できる攻撃があるかどうかはわかりませんが、神はデータURI:sを使用して巧妙なトリックがあるかどうかを知っています。

他のオプションが必要な場合は、CSRF防止トークンやCookieの二重送信などの従来の方法を検討してください。または、APIの場合、認証ヘッダーでベアラートークンを使用するだけでうまくいきます。

1
Anders

ヘッダーがCSRFから保護する方法の詳細については、 参照リファラーHTTPヘッダーを送信してCSRF攻撃から保護する方法を参照してください。

重要なポイントは、信頼できるクライアントが悪意のあるWebサイトからユーザーを保護できるメカニズムであることです。悪意のあるクライアントによって簡単に偽造される可能性があります。

あなたが尋ねるHostヘッダーについては、これは途中でリバースプロキシなどによって潜在的に書き換えられる可能性があります(したがって、これをキャプチャするための特別な転送ヘッダーが存在します、 を参照してください)https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-Host )。この目的のために設計されたヘッダーを明示的に使用することで、ヘッダーが書き換えられる可能性が低くなり(適切な中間ソフトウェアがこれらに触れないようにする必要があります)、サーバーがクライアントに誤った応答を送信します。

0
Jack