ビデオと字幕 · ダイレクト メディア ダウンローダー
CORS がブラウザーでの直接ダウンロードをブロックできる理由とその意味
· 仕組み
コル http ダウンロード
ブラウザ専用のダウンローダーは、同一生成元ポリシー内に存在します。この投稿では、CORS とは何か、一部のホストでフェッチが許可され、他のホストではフェッチが許可されない理由、およびリレー サーバーのないツールでは CORS を回避できない理由について説明します。
リンクは新しいタブでは機能しますが、ツールでは失敗します — CORS エラーがユーザーにもたらすパズル
ポッドキャスト エンクロージャは、アドレス バーに入力すると再生されますが、ページが Fetch で読み取ろうとすると失敗することがあります。ナビゲーションとスクリプトによる読み取りは、ブラウザーの異なる機能です。 1 つ目はリソースを表示します。 2 つ目は、そのバイトを別のオリジンで実行されているコードに公開する可能性があります。
ダイレクト メディア ダウンローダーは、応答チャンクを読み取り、進行状況を報告し、BLOB を構築し、名前付き保存を提供するため、2 番目の機能が必要です。メディア ホストがクロスオリジン読み取りをオプトインしていない場合、通常のナビゲーションは引き続き機能する場合でも、ブラウザーは JavaScript による応答の受信を停止します。同じ区別は、いずれかのアプリケーションがリモート ファイルを変更していなくても、アドレスを別のアプリケーションにコピーすると異なる結果が生じる理由を説明します。
同一オリジン ポリシーを 1 つの段落で説明 — toolacre.com のページが別のオリジンから提供されるバイトを自由に読み取れない理由
オリジンはスキーム、ホスト名、ポートを組み合わせます。したがって、ToolAcre から提供されるページと発行元 CDN から提供されるファイルは、通常、異なる起源を持っています。同一オリジン ポリシーは、あるオリジンのスクリプトが別のオリジンの応答を自由に読み取ることを防ぎ、アンビエント ブラウザ アクセスを通じて公開されるデータを保護します。
この制限は、ダウンローダーで作成された警告ではなく、ブラウザーによって強制されます。これは、アプリケーション コードが保護されたヘッダーまたは本体チャンクを検査できるようになる前に適用されます。送信元ホストは引き続きリクエストを受信する可能性があるため、ブロックされた読み取りを「何も接続されなかった」と表現してはなりません。オリジンの境界は、ファイル拡張子だけでなく、読み取り可能な応答にも適用されるため、明らかな `.mp3` サフィックスは、ページ スクリプトに特別な例外を与えません。
Access-Control-Allow-Origin の機能 — ツールではなくファイルのホストが、ブラウザーがバイトを引き渡してもよいかどうかをどのように決定するか
リモート サーバーは、適切な `Access-Control-Allow-Origin` ヘッダーを返すことでオプトインできます。その決定はファイル ホストの構成に属します。 ToolAcre は他の人の応答にヘッダーを追加することはできません。また、リクエスト オプションでは、受信側サーバーが保留している権限を付与することもできません。
寛容なヘッダーを使用すると、ブラウザーはページへの応答を公開できます。著作権、安全性、メディアの品質を保証するものではありません。同様に、ヘッダーが欠落していても、URL が壊れていることは証明されません。これは、このクロスオリジン スクリプトに、サーバーから返された内容を読み取る権限がないことを意味するだけです。ホスト管理者は、ストレージ名前空間全体に許容ヘッダーをやみくもに追加するのではなく、正確なリクエスト元とサポートする予定のメソッドをテストする必要があります。
ブロックされたクロスオリジン読み取りと、スクリプトが保存可能な応答を受け取らない理由
ダウンローダーは、`no-cors` ではなく、通常の CORS モードのフェッチを使用します。クロスオリジン読み取りが拒否されると、フェッチは拒否され、アプリケーション コードは使用可能なヘッダーも本文も受け取りません。ブラウザーは、CORS とすべてのトランスポート障害を区別するのに十分な詳細を意図的に表示しないため、このツールは結合された `CORS_OR_NETWORK` カテゴリを報告します。
不透明な応答は明示的な `no-cors` リクエストに属しますが、そのモードではこのジョブは解決されません。JavaScript は不透明な本体を検査して、それを目的の Blob に変換することができません。したがって、この実装は、読み取り不能な応答を取得してそれを保存できるかのように振る舞うのではなく、正直に失敗します。アプリケーションはこれらの隠しバイトを決して取得しないため、進行状況を正確に計算したり、保護されたヘッダーからファイル名を推測したり、そこから有用なオブジェクト URL を作成したりすることはできません。
成功した例: ネットワーク パネルで失敗したリクエストを読み取る — 欠落しているヘッダーを特定し、中継サーバーに接続されていないことを確認する
[ネットワーク] パネルを開き、ログを保存し、[リンクの確認] を 1 回押します。試行された HEAD 行は宛先を特定し、ブラウザの CORS 診断を示す場合があります。可能な場合は応答ヘッダーを検査します。許可ヘッダーがないことにより、ページ コードがアドバタイズされたサイズまたは MIME タイプを受信しなかった理由が説明されます。
失敗したチェックは、実際のリクエストが試行されたことをすでに証明しています。貼り付けられた URL を含む ToolAcre API 行はなく、2 番目のリレー リクエストもありません。ホストが HEAD を適切に許可しない場合でも、ダウンロードは GET を使用するため、動作が異なる可能性がありますが、どちらのパスも黙ってアーキテクチャを切り替えることはありません。コンソールの文言はブラウザごとに異なるため、運用レポートでは 1 つのベンダーの文言に依存するのではなく、失敗した行とヘッダーの証拠を保存してください。
ツールが回避しない理由 — プロキシはリンクをサーバーに送信することを意味しますが、これはまさにツールが実行しないと約束していることです
プロキシは、サーバー側でファイルを取得し、同じオリジンのエンドポイントからそれを返すことができ、ブラウザーのクロスオリジン読み取りを回避できます。また、リンクと中継されたすべてのバイトをそのオペレーターに公開し、帯域幅が発生し、任意のフェッチ サーフェスが作成されます。 ToolAcre には意図的にそのようなエンドポイントがありません。
インターフェイスによって提案されるフォールバックは、ブラウザーのネイティブの [リンクを名前を付けて保存] アクション (利用可能な場合) です。これは、ページ スクリプトの読み取りではなく、ナビゲーションまたはダウンロードの処理です。この提案は、ホスト ポリシーを弱めたり、訪問者を認証したり、保護されたストリームを直接ファイルに変換したりするものではありません。このアーキテクチャ上の拒否により、ToolAcre がブラウザーの拒否を見かけ上の成功に変えるためだけにコピー、アクセス ログ、またはアウトバウンドフェッチ権限を蓄積することも防止されます。
この内容の対象外 — CORS は、403、ログイン ウォール、または期限切れの署名付き URL と同じではありません。
CORS エラーは HTTP 403 ではありませんが、いずれの場合もワークフローが停止する可能性があります。 403 は、ホストが選択した応答ステータスです。期限切れの署名が原因で問題が発生する可能性があります。ログイン ウォールには、このツールでは省略される認証情報が必要です。ネットワークの停止、DNS 障害、証明書の問題により、ブラウザーの一般的なフェッチ拒否が発生する可能性があります。
したがって、診断では、すべての失敗をヘッダーの欠落として扱うのではなく、ネットワーク パネルとコンソール パネルを併用する必要があります。 ToolAcre は、読み取り可能な応答が到着すると既知の HTTP ステータスを報告しますが、ブラウザーがトランスポート形式の例外のみを提供する場合は推測を拒否します。これらのカテゴリを分離しておくと、承認されたパブリック オブジェクトに対して CORS を構成する、期限切れのリンクを更新する、プロバイダーを介してサインインする、または接続を修正するなど、適切な対処が行われます。
要点: CORS はホスト側の決定です。ダイレクト メディア ダウンローダーがサーバーに黙ってフォールバックするのではなく、どのように正直に報告するかです。
CORS はメディア ホストで制御されます。ブラウザのみのダウンローダーは、その選択に従い、説明し、停止することができます。クライアント コードからの選択をオーバーライドすることはできません。この境界は、任意のページがユニバーサルなクロスサイト リーダーになることを妨げるため、まさに不便です。
ホストが提供するダウンロード コントロールを使用するか、CORS 対応の承認済みファイルを要求するか、必要に応じてネイティブの保存リンクを使用します。 Direct Media Downloader は、より成功したボタンの背後にサーバーを隠すのではなく、拒否を公開し、ブラウザーからホストへの直接パスを保持することで約束を守ります。したがって、成功した結果は、協力的なホストまたは別の正規のブラウザ機能から得られるものでなければならず、同じ拒否された読み取りを保持しながらエラー テキストを抑制することによっては決して得られません。