web-dev-qa-db-ja.com

CORSエラーをトラップすることは可能ですか?

この質問は、クロスオリジンリソースシェアリング(CORS、 http://www.w3.org/TR/cors/ )に関連しています。

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

XMLHttpRequestは_http://domain2.example_を読み込めません。 Origin _http://domain1.example_は、Access-Control-Allow-Originでは許可されていません。

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

60
monsur

見る:

...また、CORSに関するXHRレベル2のメモ:

情報は意図的にフィルタリングされています。

数か月後に編集:ここでフォローアップコメントに「理由」を尋ねました。最初のリンクのアンカーにはいくつかの文字が欠けていたため、ドキュメントのどの部分を参照しているかがわかりませんでした。

これはセキュリティ上の問題です。機密性の高いHTTPヘッダーの情報を公開しないようにする試みです。 CORSに関するW3Cリンクは次のように述べています。

ユーザーエージェントは、単純な応答ヘッダーまたはフィールド名がASCII大文字と小文字を区別せず、Access-Control-のいずれかの値と一致するものであるもの以外のすべての応答ヘッダーを除外する必要があります。 CORS API仕様で定義されたAPIに応答ヘッダーを公開する前の、Expose-Headersヘッダー(存在する場合)。

その一節には、「単純な応答ヘッダー」へのリンクが含まれており、Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、およびPragmaがリストされています。したがって、それらは合格します。 "Access-Control-Expose-Headers headers"の部分では、リモートサーバーが他のヘッダーもそこにリストすることにより、それらを公開できます。詳細については、W3Cのドキュメントを参照してください。

1つのOriginがあることを思い出してください-たとえば、ブラウザーにロードし、JavaScriptを少し実行しているWebページであり、スクリプトが別のOriginにリクエストを出している場合、マルウェアは悪意のあることを行うため、通常は許可されていません仕方。そのため、スクリプトを実行し、その代わりにHTTP要求を実行するブラウザは、ゲートキーパーとして機能します。

ブラウザーはその「その他のOrigin」サーバーからの応答を調べ、それがCORSに「関与している」ように見えない場合-必要なヘッダーが欠落しているか、形式が正しくない場合-信頼できない立場にいます。ローカルで実行されているスクリプトが誠実に動作しているとは確信できません。この方法で接続されることを期待していないサーバーに接続しようとしているようです。ブラウザーは、その応答全体をフィルタリングせずにスクリプトに渡すだけで、そのリモートサーバーから機密情報を「漏らさない」はずです。これは、基本的にallowing一種のクロスオリジンリクエスト。情報漏えいの脆弱性が発生します。

これはデバッグを困難にする可能性がありますが、これは「ユーザー」がこのコンテキストの開発者であるため、セキュリティとユーザビリティのトレードオフであり、セキュリティが非常に優先されます。

30