CSRFを防止するためにシンクロナイザートークンを使用する予定ですが、 [〜#〜] owasp [〜#〜] はリファラーとOriginヘッダーも確認することをお勧めします。私はこれについて正しいロジックを理解しようと試みてきましたが、私の実験では、Firefoxの動作方法により、有効なチェック方法がないことを示しています。
Firefoxは同じOriginリクエストに対してOriginヘッダーを送信しません。これは、Originヘッダーのないリクエストを許可する必要があることを意味していると思います。データURIを試してみたところ、FirefoxもそれらからOriginヘッダーを送信していないようです。つまり、攻撃者はユーザーを悪意のあるフォームを自動送信するデータURIに誘導するだけです。
この
data:text/html;base64,PGZvcm0gYWN0aW9uPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tIiBtZXRob2Q9IkdFVCI+CjxpbnB1dCB0eXBlPSJzdWJtaXQiPgo8L2Zvcm0+
example.comに送信するフォームを含むデータURIへのリンクです。
Base64でエンコードされた次のコードはどれですか。
<form action="http://www.example.com" method="GET">
<input type="submit">
</form>
Webコンソールを開いてFirefoxで開くと、送信されたOriginヘッダーやリファラーヘッダーが表示されません。
ここで何が欠けていますか? FIrefoxからのリクエストは許可するが、データURIからの悪意のあるリクエストは許可しないロジックをサーバーで使用する必要がありますか?
それ自体の Origin ヘッダーは必ずしも十分ではありません(POSTおよびCORS要求でのみ送信されますが、GET要求があります)、Refererおよび通常、Originヘッダーは(最後に十分ではない例を含めます)。
デフォルトでは、Firefoxdoesは、同一オリジンリクエストに対してリファラーヘッダーを送信します。これは、OWASPがOriginヘッダーとRefererヘッダーの両方の使用を推奨する理由の一部です。
ソースOriginを特定するには、これらの2つの標準ヘッダーのいずれかを使用することをお勧めします。ほとんどすべてのリクエストには、次のいずれかまたは両方が含まれます。
- Originヘッダー
- リファラーヘッダー
まれであるはずの両方のヘッダーが存在しない場合(base64の場合はそのうちの1つです)、それを許可するか拒否するかを選択できます。
これらのヘッダーがどちらも存在しない場合(これは非常にまれです)、要求を受け入れるかブロックすることができます。特にランダムなCSRFトークンを2番目のチェックとして使用していない場合は、ブロックすることをお勧めします。これがしばらく発生したときにログを記録し、基本的にそれが表示されない場合は、そのようなリクエストのブロックを開始してください。
ただし、OWASPが言うように、これらのヘッダーが存在しない場合があるため、追加のチェックを使用することをお勧めします。特に、どちらのヘッダーも存在せず、正しいときにブロックしない場合は、CSRFトークンの使用をお勧めします。
ヘッダーをチェックすることは、CSRF防御における妥当な最初のステップですが、ヘッダーが常に存在するわけではないため、通常、それだけでは十分な防御とは見なされません。
ヘッダーを要求するだけでは不十分な場合:
画像の投稿など、ユーザーが作成したコンテンツがサイトで許可されている場合は、同じオリジンから偽造をリクエストすることが可能です。 GETリクエストは、次のimg
タグを公開投稿に追加するだけの簡単なものです。
<img src="/forum.php?whatever=parameters">
さらにPOSTリクエストの場合、ユーザーがHTMLを挿入できる場合form
(サイトはJavaScriptをフィルタリングできるほどスマートであるが、HTMLフォームはできない)と、可能性があります。同じオリジンからの人々にそれを提出させるように仕向けますが、これには少なくともユーザーの操作が必要になります。