非表示フィールドのヘッダーまたはトークンでのX-CSRF-Token
の使用の違いは何ですか?
隠しフィールドを使用する場合とヘッダーを使用する場合、なぜですか?
X-CSRF-Token
は、javascript/ajaxを使用しているときだと思いますが、よくわかりません
CSRF保護にはいくつかの方法があります。
従来の方法( "Synchronizer token"パターン )では、通常、各リクエストに一意の有効なトークン値を設定し、その後、リクエストが送信されるときにその一意の値を確認します。通常、非表示のフォームフィールドを設定して行います。トークンの値は通常、存続期間が短く、そのセッションに関連付けられているため、ハッカーが以前にページで見た値を再利用しようとしたり、値を推測しようとしたりすると、失敗する可能性があります。したがって、アプリケーションからのリクエストのみが機能し、アプリケーション/ドメインの外部からの偽造リクエスト(別名クロスサイトリクエストフォージェリ)は失敗します。
その欠点は、アプリケーションがすべてのHTMLフォームにこの非表示のトークンを設定する必要があることです。これらのページは、おそらく以前は静的HTMLだった場合でも、アプリケーションで動的に生成する必要があります。また、(別の一意のCSRF値を再生成するためにフォームを更新する必要があるため)戻るボタンが壊れる可能性もあります。また、サーバー側で有効なトークンを追跡し、リクエストが有効なトークンを使用していることを確認する必要もあります。これは、実装を進め、今後も維持するために、かなりの追加の労力を要する可能性があります。
別のアプローチ( と呼ばれる「Cookie-to-Headerトークン」パターン )は、セッションごとに1回Cookieを設定し、JavaScriptでそのCookieを読み取ってカスタムHTTPヘッダー(多くの場合、その値でX-CSRF-TOKEN
またはX-XSRF-TOKEN
または単にXSRF-TOKEN
)と呼ばれます。リクエストはヘッダー(JavaScriptによって設定)とCookie(ブラウザーによって標準HTTPヘッダーとして設定)の両方を送信し、サーバーはX-CSRF-TOKEN
ヘッダーの値がCookieヘッダーの値と一致するかどうかを確認できます。同じドメインで実行されるJavaScriptのみがCookieにアクセスできるため、別のドメインのJavaScriptはこのヘッダーを正しい値に設定できません(このCookieへのアクセスを許可するXSSに対してページが脆弱ではないと想定) 。偽のリンク(フィッシングメールなど)でも機能しません。正しいドメインから送信されたように見えても、Cookieのみが設定され、X-CSRF-TOKEN
ヘッダーは設定されないためです。
これは、各フォームへの呼び出しごとにトークンを設定する必要がないため、シンクロナイザートークンパターンよりもはるかに簡単に実装できます。また、CSRFトークンを追跡するのではなく、チェックも比較的簡単です(Cookieがヘッダーと一致することを確認するだけです)。有効。必要なのは、セッションごとにCookieをランダムな値に設定することだけです。一部のフロントエンドフレームワークは、Cookieが表示された場合にヘッダーを自動的に生成します(たとえば、 AngularJSがこれを行う など)。
欠点は、機能するためにJavaScriptを必要とすることです(ただし、アプリが基本的にJavaScriptなしでは機能しない場合は問題にならない可能性があります)。また、JavaScriptが行う要求(XHR要求など)-通常のHTMLフォーム要求に対してのみ機能します。ヘッダーを設定しません。これのバリエーション( "Double Submit Cookie" pattern )は、X-CSRF-TOKEN
値をHTTPヘッダーではなく非表示のフォームフィールドに配置して、これを回避しながら維持します従来のSynchronizerトークンパターンよりもシンプルなサーバー側ロジック。ただし、攻撃者がCookieを設定できる場合(多くの場合、Cookieを読み取るよりも簡単です)、 OWASPはDouble Submitメソッド のいくつかの弱点を述べているため、この場合のCSRFトークン。
さらに、シンクロナイザートークンパターンにより、追加の制御でフローを適用できます(たとえば、非表示フィールドCSRFトークンは、フォームを取得するために有効なリクエストを送信したとアプリケーションが判断した場合にのみ設定されます)。
ああ、一部のセキュリティスキャンでは、CookieにHTTP-Only
フラグが設定されていないため、JavaScriptで読み取ることができるという事実が検出されます。ただし、JavaScriptで読み取れるようにする必要があるため、慎重に行ってください。誤った警告。 X-CSRF-TOKEN
のような一般的な名前を使用している限り、彼らはこれにフラグを立てないことを知っていますが、頻繁にフラグが付けられるのを見てきました。
これらはすべて、クロスサイトリクエストフォージェリから保護するためのもので、バックエンドにリクエストを送信するときは1つだけ使用する必要がありますです。
csrf:
x-csrf-token:
laravel
をバックエンドとして使用する場合。 laravel
はこのヘッダーを自動的にチェックし、データベース内の有効なcsrf
と比較します。x-xsrf-token:
axios
などの一般的なライブラリは、xsrf-token
cookieからこのヘッダーの値を自動的に取得し、すべてのリクエストで送信します。axios
やlaravel
を使用している場合は、何もする必要はありません。ユーザーはログに記録する必要があるだけで、「認証」ミドルウェアを使用するだけで十分です。laravel
で暗号化されるため、x-csrf-token
に比べて文字列が大きくなります。