クロスオリジン読み取りブロッキング(CORB)


130

Jquery AJAXを使用してサードパーティAPIを呼び出しました。コンソールで次のエラーが発生します:

Cross-Origin Read Blocking(CORB)は、MIMEタイプapplication / jsonのクロスオリジン応答MY URLをブロックしました。詳細については、https://www.chromestatus.com/feature/5629709824032768を参照してください。

Ajax呼び出しに次のコードを使用しました。

$.ajax({
  type: 'GET',
  url: My Url,
  contentType: 'application/json',
  dataType:'jsonp',
  responseType:'application/json',
  xhrFields: {
    withCredentials: false
  },
  headers: {
    'Access-Control-Allow-Credentials' : true,
    'Access-Control-Allow-Origin':'*',
    'Access-Control-Allow-Methods':'GET',
    'Access-Control-Allow-Headers':'application/json',
  },
  success: function(data) {
    console.log(data);
  },
  error: function(error) {
    console.log("FAIL....=================");
  }
});

Fiddlerでチェックインしたとき、応答としてデータを取得しましたが、Ajax成功メソッドでは取得していません。

私を助けてください。


3
呼び出しているAPIが、JSからのクロスドメイン呼び出しを許可するために必要なヘッダーを有効にしていないようです。ほとんどの場合、代わりにサーバーで呼び出しを行う必要があります。応答がJSONPであり、プレーンなJSONではないことを確認しますか?リクエストに追加するヘッダーは、サーバーからのレスポンスに配置する必要があることにも注意してください。
Rory McCrossan

3
このCORBエラーまたは警告を解決しましたか?リクエストモジュールで同じことを経験しています。
SherwinAblañaDapito

3
@SherwinAblañaDapitoまだ解決策を探している場合は、開発/テスト環境に対する私の回答を参照しください
Colin Young

1
JSが正しく機能する方法を示すために、Chromeを非セーフモードで起動できますchrome.exe --user-data-dir = "C:/ Chrome dev session" --disable-web-securityしかし、「読み取りブロック(CORB)」ブロックされたクロスオリジン応答」はサーバー側で修正する必要があります。
Ruslan Novikov

回答:


37
 dataType:'jsonp',

JSONPリクエストを作成していますが、サーバーはJSONで応答しています。

セキュリティ上のリスクがあるため、ブラウザはJSONをJSONPとして扱うことを拒否しています。(ブラウザー JSONをJSONPとして処理しようとした場合、せいぜい失敗するだけです)。

参照してくださいこの質問を JSONPが何であるかの詳細については。CORSが利用可能になる前に使用されていたSame Origin Policyを回避するための厄介なハックであることに注意してください。CORSは、この問題に対するよりクリーンで安全で強力なソリューションです。


クロスオリジンリクエストを作成しようとしていると思われ、競合する命令の大量の山に考えられるすべてのものを投げています。

同一生成元ポリシーがどのように機能するかを理解する必要があります。

詳細なガイドについては、この質問を参照してください。


コードに関するいくつかの注意事項:

contentType: 'application/json',
  • JSONPを使用する場合、これは無視されます
  • GETリクエストを作成しています。タイプを説明するリクエストボディはありません。
  • これにより、クロスオリジンリクエストが単純でなくなります。つまり、基本的なCORS権限と同様に、プリフライトも処理する必要があります。

それを削除します。

 dataType:'jsonp',
  • サーバーがJSONPで応答していません。

これを削除します。(代わりにサーバーをJSONPで応答させることもできますが、CORSの方が優れています)。

responseType:'application/json',

これはjQuery.ajaxでサポートされているオプションではありません。これを削除します。

xhrFields:{withCredentials:false}、

これがデフォルトです。ajaxSetupでtrueに設定しない限り、これを削除してください。

  headers: {
    'Access-Control-Allow-Credentials' : true,
    'Access-Control-Allow-Origin':'*',
    'Access-Control-Allow-Methods':'GET',
    'Access-Control-Allow-Headers':'application/json',
  },
  • これらは応答ヘッダーです。それらは要求ではなく、応答に属します。
  • これにより、クロスオリジンリクエストが単純でなくなります。つまり、基本的なCORS権限と同様に、プリフライトも処理する必要があります。

20

ほとんどの場合、ブロックされた応答はWebページの動作に影響しないはずであり、CORBエラーメッセージは無視しても問題ありません。たとえば、ブロックされた応答の本文がすでに空である場合、または応答を処理できないコンテキスト(404エラーページなどのHTMLドキュメント)に応答が配信される場合に、警告が発生することがあります。タグに配信されます)。

https://www.chromium.org/Home/chromium-security/corb-for-developers

ブラウザのキャッシュを消去する必要がありました。このリンクを読んでいました。リクエストが空のレスポンスを受け取った場合、この警告エラーが発生します。リクエストでいくつかのCORSを取得していたため、このリクエストの応答が空になり、ブラウザのキャッシュをクリアするだけでCORSを取得できました。クロムがPORT番号をキャッシュに保存したため、CORSを受信して​​いました。サーバーが受け入れるだけで、キャッシュのためlocalhost:3010に実行していましたlocalhost:3002


12

ヘッダー 'Access-Control-Allow-Origin:*'を含む応答を返します以下のPhpサーバー応答のコードを確認してください。

<?php header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
echo json_encode($phparray); 

2
あなたの返答は私をとても助けました!!! 感謝しきれません。「アクセス制御許可オリジン」が何をするのかを引き続き調査して、影響を理解しますが、PHP Webサービスの作成の基本を学んでいるだけで、信じられないような助けになりました。ありがとうございました!!!
アダムローリー

これはまったく問題に対処していません。応答を送信することで発生するCORBエラーContent-Type: application/jsonです。OPのコードはすでにこれを実行している必要があります。
クエンティン

1
@クエンティン、??? 常識では、「オリジンを許可」を設定している限り、疑わしいヘッダーや本文に関係なく、ブラウザーはリクエストを許可します。
パセリエ

7

サーバー側でCORSを追加する必要があります。

nodeJSを使用している場合:

まず、以下のコマンドを使用してインストールする必要があり ますcors

npm install cors --save

さて、次のコードを追加します(のようなアプリの起動ファイルへapp.js or server.js

var express = require('express');
var app = express();

var cors = require('cors');
var bodyParser = require('body-parser');

//enables cors
app.use(cors({
  'allowedHeaders': ['sessionId', 'Content-Type'],
  'exposedHeaders': ['sessionId'],
  'origin': '*',
  'methods': 'GET,HEAD,PUT,PATCH,POST,DELETE',
  'preflightContinue': false
}));

require('./router/index')(app);

22
問題を修正するために拡張機能を追加する必要がある場合は、サーバー側でリクエストを誤って処理しています。ただのメモ。
Alexander Falk

2
ユーザーに奇妙なChrome拡張機能をインストールするよう依頼するのは現実的ではありません。他のブラウザはどうですか?
イスラエルロドリゲス

2
この回答は問題を長期的に解決するものではありませんが、CORSの問題であることを同僚に確認したこのプラグインを使用していました。そのために賛成です!
KoldBane 2018

2
@VladimirNul元の答えはクロム拡張についてでした。Shubhamが書き直しました。履歴を確認してください。
イスラエルロドリゲス

3
ここには混乱があります。OPはCORSではなくCORBを参照しています。
マシンではない

3

質問からは明らかではありませんが、これが開発またはテストクライアントで起こっていることであると想定し、すでにFiddlerを使用している場合、Fiddlerに許可応答で応答させることができます。

  • Fiddlerで問題のリクエストを選択します
  • AutoResponderタブを開く
  • Add Ruleルールをクリックして編集します。
    • ここにメソッド:OPTIONS サーバーのURL、例えばMethod:OPTIONS http://localhost
    • *CORSPreflightAllow
  • 小切手 Unmatched requests passthrough
  • 小切手 Enable Rules

いくつかのメモ:

  1. 明らかに、これはAPIサービスを変更することが不可能/実用的でない開発/テストのためのソリューションにすぎません
  2. サードパーティのAPIプロバイダーとの契約がこれを許可していることを確認してください
  3. 他の人が指摘したように、これはCORSの動作の一部であり、最終的にはヘッダーをAPIサーバーで設定する必要があります。そのサーバーを制御している場合は、自分でヘッダーを設定できます。この場合、それはサードパーティのサービスであるため、発信元サイトのURLを提供できるメカニズムがいくつかあるだけであり、適切なヘッダーで応答するようにサービスを更新します。


2

dataTypeあなたのajaxリクエストのをからjsonpに変更してみましたjsonか?それは私の場合それを修正しました。


2

Chrome拡張機能では、

chrome.webRequest.onHeadersReceived.addListener

サーバーの応答ヘッダーを書き換えます。既存のヘッダーを置き換えるか、追加のヘッダーを追加できます。これはあなたが望むヘッダーです:

Access-Control-Allow-Origin: *

https://developers.chrome.com/extensions/webRequest#event-onHeadersReceived

CORBの問題に悩まされ、これで修正されました。


1
「Chrome 72以降、Cross Origin Read Blocking(CORB)が応答をブロックする前に応答を変更する必要がある場合は、opt_extraInfpSpecで「extraHeaders」を指定する必要があります。」webRequestsドキュメントから
スイスの

0

応答ヘッダーは通常、サーバーで設定されます。設定する'Access-Control-Allow-Headers'には'Content-Type'、サーバー側で


7
サードパーティのAPIを使用しています。だから私はそれができません。クライアント側の解決策を教えてください。
Jignesh

4
サーバーは何を許可し、何を許可しないかを決定します。サーバーのみがそのアクセス権を持っています。クライアント側からの応答ヘッダーの制御はセキュリティ上のリスクです。クライアント側の仕事は、適切な要求を送信し、サーバーから送信された応答を取得することです。:この参照stackoverflow.com/questions/17989951/...
lifetimeLearner007

48
これはCORSではなくCORBです。
ホアキンブランダン

0

Cross-Origin Read Blocking(CORB)は、疑わしいクロスオリジンリソースロードが、Webページに到達する前にWebブラウザーによって識別およびブロックされるアルゴリズムです。これは、ブラウザーが特定のクロスオリジンネットワークレスポンスを送信しないように設計されています。ウェブページへ。

まず、これらのリソースが正しい「Content-Type」で提供されていることを確認します。つまり、JSON MIMEタイプ-" text/json"、 " application/json"、HTML MIMEタイプ-" text/html"の場合です。

2番目:モードをcorsに設定します。 mode:cors

フェッチは次のようになります

 fetch("https://example.com/api/request", {
            method: 'POST',
            body: JSON.stringify(data),
            mode: 'cors',
            headers: {
                'Content-Type': 'application/json',
                "Accept": 'application/json',
            }
        })
    .then((data) => data.json())
    .then((resp) => console.log(resp))
    .catch((err) => console.log(err))

参照:https : //chromium.googlesource.com/chromium/src/+/master/services/network/cross_origin_read_blocking_explainer.md

https://www.chromium.org/Home/chromium-security/corb-for-developers


0

このコンテキストで言及する価値のあるエッジケースがあります。Chrome(少なくとも一部のバージョン) は、CORBに設定されたアルゴリズムを使用してCORSプリフライトをチェックします。IMO、プリフライトはCORB脅威モデルに影響を与えず、CORBはCORSと直交するように設計されているため、これは少しばかげています。また、CORSプリフライトの本文にはアクセスできないため、苛立たしい警告だけで悪影響はありません。

とにかく、CORSプリフライト応答(OPTIONSメソッド応答)に本文がない(204)ことを確認してください。コンテンツタイプapplication / octet-streamと長さ0の空の200もここではうまく機能しました。

これが当てはまるかどうかを確認するには、メッセージ本文でCORB警告とOPTIONS応答をカウントします。


0

この警告は、200の空の応答を送信したときに発生したようです。

私のこの設定では、.htaccessChromeで警告が表示されます。

Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST,GET,HEAD,OPTIONS,PUT,DELETE"
Header always set Access-Control-Allow-Headers "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization"

RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule .* / [R=200,L]

しかし最後の行を

RewriteRule .* / [R=204,L]

問題を解決してください!


-2

Chrome拡張機能にも同じ問題がありました。私のマニフェストの「content_scripts」オプションにこの部分を追加しようとしたとき:

//{
    //  "matches": [ "<all_urls>" ],
    //  "css": [ "myStyles.css" ],
    //  "js": [ "test.js" ]
    //}

そして、私は私のマニフェスト「許可」から他の部分を削除します:

"https://*/"

XHR要求の1つでCORBを削除した場合のみ、表示されなくなります。

最悪の場合、コードにXHR要求がほとんどなく、そのうちの1つだけがCORBエラーを受け取り始めます(なぜCORBが他のXHRに当てはまらないのか、わからない。マニフェストの変更がこのエラーを引き起こした理由はわからない)。そのため、コード全体を数時間で何度も検査し、多くの時間を失いました。


サーバー側のヘッダーに問題がありました。ASP.NETの戻り値を次のように変更します。public async Task <string> Get(string TM)戻り値は少し前のJSON(コンテンツタイプは「application / json」だと思います)でしたが、もう一方です(「text / plain ")。そして、それは役立ちます。今、私はマニフェストの「許可」を「https:// * /」に戻し、それが機能します。
ОлегХитрень

-3

Safariでそれを行う場合は時間がかかりません。[設定] >> [プライバシー]から開発者メニューを有効にし、開発メニューから[クロスオリジン制限を無効にする]をオフにします。ローカルのみが必要な場合は、開発者メニューを有効にし、開発メニューから[ローカルファイル制限を無効にする]を選択するだけです。

Chrome for OSXでターミナルを開いて実行:

$ open -a Google\ Chrome --args --disable-web-security --user-data-dir

--OSX上のChrome 49以降ではuser-data-dirが必要

Linuxの場合:

$ google-chrome --disable-web-security

また、AJAXやJSONなどの開発目的でローカルファイルにアクセスしようとしている場合も、このフラグを使用できます。

-–allow-file-access-from-files

Windowsの場合は、コマンドプロンプトに移動し、Chrome.exeがあるフォルダーに移動して、次のように入力します。

chrome.exe --disable-web-security

これにより、同じ生成元ポリシーが無効になり、ローカルファイルにアクセスできるようになります。


-3

サーバーからのjsonp応答の形式が間違っているため、この問題が発生しました。不正な応答は次のとおりです。

callback(["apple", "peach"])

問題は、内部のオブジェクトがcallbackjson配列ではなく、正しいjsonオブジェクトであることです。だから私はいくつかのサーバーコードを変更し、そのフォーマットを変更しました:

callback({"fruit": ["apple", "peach"]})

ブラウザは変更後の応答を喜んで受け入れました。


callback(["apple", "peach"])完全に有効なJSONPであり、オリジン全体でテストしたところ、問題なく動作しました。
クエンティン

-4

Google Chromeで問題が発生している場合は、「Moesif CORS」拡張機能をインストールしてみてください。クロスオリジンリクエストであるため、応答ステータスコードが200であっても、Chromeは応答を受け入れません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.