日本語

ビデオと字幕 · ダイレクト メディア ダウンローダー

Web ブラウザーにおける同一生成元ポリシーと CORS の短い歴史

· 背景

コル ウェブ履歴 セキュリティ

制御されたクロスオリジン HTTP アクセスに進化する初期のブラウザー オリジン
オリジナル ToolAcre ベクトル イラスト

ブラウザ ツールが別のサイトのファイルを自由に読み取ることを阻止するルールは、最も初期のスクリプト ブラウザにまで遡ります。この投稿では、最終的に制御されたサイト間フェッチを可能にした同一生成元ポリシー、XMLHttpRequest、および CORS 標準について追跡します。

ブラウザが受け取ったばかりのバイトを自分のタブに渡すことを拒否する理由 — 数十年前のルールの日常的な影響

ブラウザはリモート ファイルを表示しても、その応答本文をページ JavaScript に渡すことを拒否できます。明らかな矛盾は、ナビゲーションとプログラムによるクロスオリジン読み取りの間のセキュリティの分離です。

ダイレクト メディア ダウンローダーは、チャンクを BLOB に読み取る必要があるため、このルールに遭遇します。ネイティブの「リンクを名前を付けて保存」は、別のブラウザーのパスをたどるため、フェッチが失敗した場合でも機能します。この特定のダウンローダーが自身の呼び出しから資格情報を意図的に省略している場合でも、拒否によりブラウザーの他の場所にある Cookie とイントラネット リソースが保護されます。この特定のリクエストが資格情報を省略している場合でも、境界により、同じブラウザー内の無関係な Cookie とイントラネット ページが保護されます。

Netscape、JavaScript、および最初のオリジン ルール - 同一オリジン ポリシーのきっかけとなったセキュリティ問題

初期の Web スクリプトでは、あるサイトが訪問者のアンビエント アクセスを通じて別のサイトの機密ページを読み取らないようにする必要がありました。ブラウザーは、原点を中心にその境界を整理しました。

履歴の詳細は実装によって異なるため、実際の継承が最も重要です。スキーム、ホスト、およびポートは、スクリプト読み取り可能なリソースの信頼コンパートメントを定義します。オリジンを 1 つの単位として扱うことは、ドキュメント、スクリプト、ネットワーク API にわたって一貫して適用できるエンジニアリング境界でした。オリジンのグループ化により、ブラウザ エンジンがドキュメント、スクリプト、ストレージ、ネットワーク応答全体に適用できる強制可能な単位が提供されました。このモデルは不完全ですが、開発者に無制限のアンビエント権限ではなく、予測可能なデフォルトを提供します。

XMLHttpRequest と壁に囲まれた Web — スクリプト化されたリクエストがルールをどのように継承するか、そしてマッシュアップが困難になる理由

XMLHttpRequest はバックグラウンド HTTP 作業を有効にしましたが、オリジン制限は維持されました。これにより、同じサイトのアプリケーションは便利になりましたが、クロスサイトのマッシュアップには協力やサーバーの仲介が必要でした。

ユニバーサル クライアント オーバーライドにより、保護が破壊される可能性があります。ターゲットを所有するサーバーには、どの外部オリジンが選択された応答を読み取ることができるかを表現する方法が必要でした。サーバー リレーは一般的な回避策になりましたが、信頼性、帯域幅、リクエスト偽造のリスクがブラウザー サンドボックスの外側のインフラストラクチャに移されました。リレーの回避策は、ポリシーを排除するのではなく、帯域幅、信頼、サーバー側のリクエスト偽造のリスクをクライアント サンドボックスの外に移しました。これらの仲介者が意図的に導入される場合は、独自のセキュリティ、プライバシー、不正行為の制御が必要です。

CORS 標準 — Access-Control ヘッダーを使用して、デフォルトを緩めることなくサーバーがクロスオリジン読み取りを選択できるようにする方法

CORS は、ブラウザーによって解釈される HTTP 応答ヘッダーを通じてその連携を提供します。 `Access-Control-Allow-Origin` は、要求元を承認したり、資格情報が不要な場合には、より広範な対象者を承認したりできます。

このメカニズムでは、同一生成元ポリシーをグローバルに無効にすることはありません。これにより、ホストがプロトコルの下で公開することを選択した応答へのスコープ付き読み取りアクセスが許可されます。プリフライト結果はプロトコル ルールに基づいてブラウザによってキャッシュされるため、監査では 1 つのウォーム トレースから「ポリシー チェックが行われていない」と推測されるべきではありません。これにより、デフォルトの分離が維持され、リソース所有者が選択した呼び出し元とメソッドに対して意図的な例外を発行できるようになります。

プリフライト、単純なリクエスト、および不透明な応答 - ほとんどのダウンロード失敗を説明する語彙

一部のクロスオリジン リクエストは、プリフライトを必要としないほど単純です。他の人は、最初に OPTIONS を送信して、メソッドとヘッダーが許可されているかどうかを尋ねます。プリフライトはネゴシエーションであり、実際のメディア転送ではありません。

不透明な応答は no-cors モードから発生し、ステータス、ヘッダー、および本文をスクリプトから隠します。読み取り不可能なボディは意図した保存可能な Blob になることができないため、ToolAcre はそのモードを選択しません。 CORS エラーはサーバー側リクエストの成功と同時に発生する可能性があり、アプリケーションの失敗がオリジンが何も受信したことを意味しないことを裏付けています。キャッシュされたプリフライト決定は、1 つのウォーム トレースに表示される内容を変更する可能性があるため、歴史的に OPTIONS が存在しないことは、ネゴシエーションが存在しなかったことを証明するものではありません。

ブラウザーのみのダウンローダーにとって CORS が意味するもの — ホストが決定し、ツールがオーバーライドすることはできず、それについて正直に答えることが正しい対応です

このダウンローダーの場合、ホストは HEAD 応答と GET 応答が読み取り可能かどうかを判断します。 ToolAcre はホストに代わってallow-origin 応答ヘッダーを添付できず、独自のオリジンを介して本文を中継しません。

このエラーは、CORS とネットワークの可能性を組み合わせたものです。これは、一部の障害において Fetch が意図的に詳細な情報を差し控えるためです。 DevTools は、アプリケーション コードが受け取る以上のものを訪問者に明らかにする可能性があります。ホストオペレーターは、ローカル構成の意図に依存するのではなく、意図されたオリジン、メソッド、およびヘッダーのみを承認し、それらの正確な運用応答を検証する必要があります。ブロックされた読み取りは、リクエストを受信したサーバーと共存する可能性があります。そのため、インターフェイスでは、アプリケーションの障害と接続がないことを同一視することはありません。

要点: 迷惑な場合でもユーザーを保護するルール — ダイレクト メディア ダウンローダーが周囲ではなく内部でどのように機能するか

このルールは、正当なファイル転送を妨げる場合でもユーザーを保護します。ブラウザ アプリケーションにパブリック メディアを読み取らせたいホストは、適切な CORS 応答を構成できます。このスクリプト パスを通じてアクセスできない状態にならないもの。

ダイレクト メディア ダウンローダーはそのモデル内で動作します。ローカルで検証し、オープンにリクエストし、拒否を説明し、適切な場合はネイティブ保存を提案します。ブラウザーのセキュリティ境界をバイパスの問題に変えるわけではありません。その歴史を理解すると、ブラウザの任意の敵意によるエラーが、デフォルト拒否のクロスサイト読み取りモデルの目に見える結果に変わります。オリジン所有者は、ダッシュボード構成のみに依存するのではなく、意図したメソッドの正確な運用ヘッダーをテストする必要があります。