私は答えを見ました Cookieを使用しない場合でもCSRFは可能ですか? しかし、2つの矛盾する答えがあり、質問自体はそれほど多くの情報を提供しません。
別のドメインで実行されている(独自に作成した)Webクライアントが使用するREST APIを作成しているので、CORSリクエストを実行します。このAPIはoauth2リソースサーバーとして実行されるため、認証ヘッダーで渡されるアクセストークンによってアクセスが制限されます。 Cookieはありません。すべてステートレスです。 https://spring.io/blog/2011/11/30/cross-site-request-forgery-and-oauth2 の記事のアドバイスに従っています
x-www-form-urlencoded
)で1回限りの認証コードを渡すことで行われます。これは通常の方法のようですが、クエリパラメータではないため、ブラウザの履歴にスタックしないでください。それはその側のほとんどすべてをカバーしていると思います。
現在、IS SSOであると想定され、セッションを持ち、基本認証でアクセス可能な、oauth2認証サーバー自体の形式の別の可能な攻撃ベクトルがあります。ただし、実際に役立つcsrf攻撃で実行できるアクションはないようです。これらのoauthエンドポイントにリクエストを行うことはできますが、結果を読み取ることができる必要があります。これは、CORS構成とリダイレクトURIが事前登録されているという事実によって妨げられます。パスワードを変更したり、電子メールアドレスをリセットしたりするためにPOSTすることはできません。これらすべては、実際にはリソースサーバーとしても公開されます。
何か不足していますか?ここで脆弱性の調査をどのように行いますか?
最初の質問に答えるには、Cookie(セッション)を使用しておらず、ブラウザー内で基本認証を使用していない場合、リソースサーバーにCSRF対策を実装する必要はありません。
Cookieと基本認証ヘッダーは、アクセスするすべてのドメイン名についてブラウザーによって保存され、サイトにリクエストを送信するたびに、保存されたCookieと基本認証ヘッダーがリクエストヘッダーに自動的に追加されます。
アクセストークンを使用しているため、おそらくAuthorization: Bearer <token>
、あなたは安全でなければなりません。ご使用のブラウザーはこの種の許可の処理方法を認識していないため、すべての要求にこのヘッダーを手動で追加する必要があります。
OAuth 2.0標準で推奨されている、事前登録されたリダイレクトURIを使用しています。これにより、認証サーバーのみが信頼できるサイトに認証コードsends認証コードを確実に送信します。
リダイレクトURIがHTTPSなどの安全なスキームを使用していることが重要です。そうでないと、MITM攻撃に対して脆弱になります。
認証サーバーからリダイレクトされたときに、サイトはクエリパラメータを通じて認証コードを受信しています。ほとんどの場合、認証コードはアクセストークンとすぐに交換され、後で認証コードを取り消す必要があります。
state
パラメータは、CSRF攻撃を防ぐためにここで使用する必要があります。ランダムな値をauthorize
エンドポイントに送信し、認証コードで同じ値を受け取っていることを確認します。 SPAでは、ランダムな値をローカルストレージに保存できます。
SPAでは、これについて心配する必要はありません。ステートフルなサーバー側Webアプリケーション。攻撃者が自分のWebページから認証ページにリダイレクトするとどうなりますか?あなたはあなた自身のSPAに行き着き、そこで攻撃者は続けることができないはずです。
ステートフルなサーバー側アプリケーションでは、この承認を行うことで、実際にアカウントをリンクし、事態が発生する可能性があります。 (もちろん、アプリケーションによって異なります。)
token
エンドポイントのCORSまず、CORSはブラウザによってのみチェックされるため、攻撃者がtoken
エンドポイントを使用するのを阻止するために、これに依存することはできません。
ここでCORSを回避するために、攻撃者が行う必要があるのは、token
エンドポイントにリクエストを送信するだけのプロキシエンドポイントを作成することです。
さらに、token
エンドポイントは、有効な認証コードを受け取った場合にのみ機能します。
authorize
エンドポイントのCORS通常、ユーザーはauthorize
エンドポイントにリダイレクトし、そこで(サインインして)認証ボタンをクリックし、アプリケーションへのアクセスを許可します。
CORSがなければ、攻撃者は自分のサイトを作成できる可能性があります。攻撃者はXHR
/fetch
を使用してauthorize
ページを取得します。また、ユーザーがauthorize
ページに(ステートフルに)サインインしているとすると、ユーザーの同意なしに、承認ボタンをクリックできるようになります。
XHR
ページを取得するためにfetch
/authorize
を使用する必要があるシナリオはありません。したがって、CORSで安全にブロックできます。
作成時に許可サーバーがステートフルである場合、何かを変更する可能性のあるアクションを実行するときはいつでも、CSRF保護を実装する必要があります。一般的にこれを行うのがベストプラクティスであり、将来パスワード更新機能を追加する場合、CSRFから保護するために必要なコードがすでにあります。
OAuth仕様を理解しているようで、想定どおりのことをしているようです。