CORS設定の誤り

C#でのCORS設定の誤り

説明

任意のリクエストOriginと認証情報の送信を許可すると、ブラウザーが認証情報を送信する条件で、信頼できないWebサイトが保護されたレスポンスを読み取れるおそれがあります。実際にCookieが送信されるかどうかは、クライアント設定、SameSite、ブラウザーのポリシーにも左右されます。

AllowAnyOrigin() と AllowCredentials() の組み合わせは、認証情報を伴うCORSの有効な構成ではありません。この制限を回避するために SetIsOriginAllowed(_ => true) を使うと、任意のOriginを信頼することになります。CORSはサーバー側の認証や権限チェックを代替しません。

想定される影響

  • ユーザーの認証Cookieが送信されると、信頼できないオリジンから認証済みのレスポンスを読み取り、データを盗まれるおそれがあります。

対処方法

スキーム、ホスト、ポートを明示した信頼できるオリジンだけを許可し、認証情報の送信は必要な場合に限って許可してください。任意のOriginをそのまま応答に反映せず、サーバー側の認証や権限チェックも維持してください。

例

各抜粋は、別々の CorsPolicyBuilder の設定です。ポリシーの登録とエンドポイントへの適用は省略しています。

変更前

csharp
policy.SetIsOriginAllowed(_ => true).AllowCredentials();

変更後

csharp
policy.WithOrigins("https://app.example.com").AllowCredentials();

解説:

  • 変更前: すべてのOriginを信頼し認証情報を許可するため、認証情報が送信されると、信頼できないオリジンからもレスポンスを読み取れます。
  • 変更後: 明示的に信頼するオリジンを使用し、任意のOriginヘッダーをそのまま反映しないでください。

参考資料