web-dev-qa-db-ja.com

リファラーをチェックすることは、CSRF攻撃から保護するのに十分ですか?

リファラーのチェックは、クロスサイトリクエストフォージェリ攻撃から保護するのに十分ですか?リファラーが偽装される可能性があることは知っていますが、攻撃者がクライアントに対してそれを行う方法はありますか?トークンが標準であることは知っていますが、これでうまくいくでしょうか?

43
ryeguy

とりわけ、ブラウザ(または企業プロキシ)がリファラーを送信しないユーザーの場合、リファラーの使用は機能しません。

12

これは3歳の質問で、基本的に同じことを4つの異なる回答で示しています。標準に従って、トークンを使用し、リファラーは使用しないでください。

トークンは依然として最も安全なオプションであると考えられていますが、リファラーを使用する方がはるかに簡単で、非常に安全です。すべてのPUT/POST/PATCH/DELETE-requestsを確認し、リファラーが見つからない場合や間違ったドメインからの攻撃であると考えてください。実際には、これらの種類の要求のリファラーを削除するプロキシは(存在する場合)わずかです。

CSRF保護としてのリファラーヘッダーの確認については、 OWASP推奨 も参照してください。

Refererヘッダーの確認

ご使用のブラウザーでリファラーヘッダーを偽装することは簡単ですが、CSRF攻撃では不可能です。リファラーの確認は、ユーザーごとの状態を必要としないため、組み込みネットワークデバイスでCSRFを防止するために一般的に使用される方法です。これは、メモリが不足している場合にリファラーをCSRF防止の有用な方法にします。

ただし、リファラーをチェックすることは、CSRF保護の弱点と見なされます。たとえば、オープンリダイレクトの脆弱性を使用して、リファラーチェックで保護されているGETベースのリクエストを悪用することができます。これはHTTP仕様に違反しているため、GETリクエストで状態が変化することはありません。

リファラーチェックの一般的な実装ミスもあります。たとえば、CSRF攻撃がHTTPSドメインから発生した場合、リファラーは省略されます。この場合、リファラーの欠如は、リクエストが状態変更を実行しているときの攻撃と見なされます。また、攻撃者はリファラーへの影響が限られていることにも注意してください。たとえば、被害者のドメインが「site.com」の場合、攻撃者は「site.com.attacker.com」から発信されたCSRFエクスプロイトを使用し、破損したリファラーチェックの実装をだます可能性があります。 XSSは、リファラーチェックをバイパスするために使用できます。

44

唯一の正しい答えは、「ブラウザ(または企業プロキシ)がリファラーを送信しないユーザーに対して、リファラーを使用しても機能しない」です。そうは言っても、今日では非常に珍しいことです。リファラーを偽造することができると言っているすべての人々はそれでいっぱいです。他の方法(XSS/Trojan/etc)で他の人のブラウザーを制御できない限り、リファラーを偽ることはできません。アプリの使用にリファラーが必要な場合、リファラーはCSRFトークンと同じくらい効果的です。チェックが正しいことを100%確認していることを確認してください(たとえば、正規表現を使用している場合は、参照元の "^"の最初から確認してください)。

4
Matthew Lenz