1. ホーム
  2. javascript

[解決済み] CORSのエラーをトラップすることは可能ですか?

2023-07-26 16:22:41

質問

この質問は、Cross-Origin Resource Sharing (CORS.) に関連するものです。 http://www.w3.org/TR/cors/ ).

CORS リクエスト時にエラーが発生した場合、Chrome(および AFAIK 他のブラウザー)はエラー コンソールにエラーをログに記録します。 メッセージの例は次のようになります。

XMLHttpRequest を読み込むことができません http://domain2.example . 起源 http://domain1.example は Access-Control-Allow-Origin で許可されません。

このエラーメッセージをプログラムで取得する方法はないでしょうか? 私は xhr.send() の呼び出しを try/catch でラップしてみました。 onerror() イベントハンドラを追加してみました。 どちらもエラーメッセージを受け取りません。

どのように解決するのですか?

ご覧ください。

...また、CORSについてのXHR Level 2での注記もあります。

意図的にフィルタリングされた情報です。

何ヶ月も経ってから編集。最初のリンクのアンカーが数文字欠けていて、私が参照しているドキュメントのどの部分なのかがわかりにくくなっていました。

これはセキュリティの問題で、HTTP ヘッダーに含まれる機密性の高い情報の公開を回避するための試みです。CORS に関する W3C のリンクにはこうあります。

ユーザーエージェントは、CORS API 仕様で定義された API に応答ヘッダーを公開する前に、単純な応答ヘッダー、またはフィールド名が Access-Control-Expose-Headers ヘッダーの値の 1 つと ASCII ケース感受性で一致するもの以外のすべての応答ヘッダーをフィルタアウトしなければなりません(もしあるならば)。

その通路には、Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma をリストする "simple response header" のリンクが含まれています。そのため、これらはパスされます。Access-Control-Expose-Headers headers"の部分は、リモートサーバーが他のヘッダも公開できるように、そのヘッダをリストアップしています。詳しくはW3Cのドキュメントを参照してください。

ブラウザに読み込まれたウェブページで JavaScript が実行されているとすると、スクリプトは別のオリジンにリクエストします。そこで、スクリプトを実行し、HTTP リクエストを代行するブラウザがゲートキーパーとして機能します。

ブラウザは、他のオリジン サーバーからの応答を見て、それが CORS に参加していないように見える場合 (必要なヘッダーがない、または不正な形式である) は、信頼できない状態にあります。ローカルで実行されているスクリプトが誠実に動作しているかどうかを確認することはできません。ブラウザは、フィルタリングなしでスクリプトに応答全体を渡すことによって、リモート サーバーから機密情報を漏えいさせるべきではありません - それは基本的に を許可することになります。 を許可しているようなものです。情報漏洩の脆弱性が発生します。

これはデバッグを困難にしますが、セキュリティとユーザビリティのトレードオフであり、この文脈では "user"は開発者であるため、セキュリティは重要な優先事項です。