क्रॉस-ओरिजिन पढ़ें ब्लॉकिंग (CORB)


130

मैंने Jquery AJAX का उपयोग करके तृतीय पक्ष API को बुलाया है। कंसोल में मुझे निम्न त्रुटि मिल रही है:

क्रॉस-ओरिजिन रीडिंग ब्लॉकिंग (CORB) ब्लॉक की गई मूल प्रतिक्रिया MY URL को MIME टाइप एप्लिकेशन / json के साथ ब्लॉक किया गया । अधिक जानकारी के लिए https://www.chromestatus.com/feature/5629709824032768 देखें ।

मैंने अजाक्स कॉल के लिए निम्नलिखित कोड का उपयोग किया है:

$.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....=================");
  }
});

जब मैंने फिडलर में जाँच की, तो मुझे जवाब में डेटा मिला है, लेकिन अजाक्स की सफलता के तरीके में नहीं।

कृपया मेरी मदद करें।


3
ऐसा लगता है कि आप जिस एपीआई को कॉल कर रहे हैं वह जेएस से क्रॉस-डोमेन कॉल की अनुमति देने के लिए आवश्यक हेडर को सक्षम नहीं करता है। आपको इसके बजाय सर्वर पर कॉल करने की सबसे अधिक आवश्यकता होगी। क्या आप सुनिश्चित हैं कि प्रतिक्रिया JSONP है और सादे JSON नहीं है? यह भी ध्यान दें कि आप जिस हेडर को रिक्वेस्ट में जोड़ रहे हैं उसे रिस्पॉन्स में रखने की जरूरत है , उन्हें सर्वर से में रखने की आवश्यकता है।
रोरी मैकक्रॉन

3
क्या आपने इस CORB त्रुटि या चेतावनी को हल किया है? मैं अनुरोध मॉड्यूल के साथ समान अनुभव कर रहा हूं।
शेरविन अबलाना डापिटो

3
@ SherwinAblañaDapito यदि आप अभी भी एक समाधान की तलाश कर रहे हैं, तो विकास / परीक्षण वातावरण के लिए मेरा जवाब देखें
कॉलिन यंग

1
यह दर्शाने के लिए कि आपका JS सही तरीके से कैसे काम कर सकता है, आप Chrome को एक असुरक्षित मोड में शुरू कर सकते हैं chrome.exe --user-data-dir = "C: / Chrome dev session" --disable-web-security but "Read Blocking (CORB) अवरुद्ध क्रॉस-मूल प्रतिक्रिया " सर्वर साइड पर तय की जानी चाहिए।
नोविकोव

जवाबों:


37
 dataType:'jsonp',

आप JSONP अनुरोध कर रहे हैं, लेकिन सर्वर JSON के साथ प्रतिक्रिया दे रहा है।

ब्राउज़र JSON को JSONP के रूप में मानने की कोशिश करने से इनकार कर रहा है क्योंकि यह एक सुरक्षा जोखिम होगा। (यदि ब्राउज़र ने JSON को JSONP के रूप में मानने की कोशिश की तो यह सबसे अच्छा होगा, विफल)।

JSONP क्या है, इस बारे में अधिक जानकारी के लिए यह प्रश्न देखें । ध्यान दें कि एक मूल हैक वही मूल नीति के आसपास काम करने के लिए है जो कॉर्स उपलब्ध होने से पहले उपयोग किया गया था। कॉर्स समस्या के लिए अधिक साफ, सुरक्षित और अधिक शक्तिशाली समाधान है।


ऐसा लगता है कि आप एक क्रॉस-ऑरिजनल रिक्वेस्ट करने की कोशिश कर रहे हैं और हर उस चीज को फेंक रहे हैं, जिस पर आप एक बड़े पैमाने पर संघर्षपूर्ण निर्देशों का ढेर लगा सकते हैं।

आपको यह समझने की आवश्यकता है कि समान उत्पत्ति नीति कैसे काम करती है।

देख इन-गाइड गाइड के लिए इस प्रश्न को ।


अब आपके कोड के बारे में कुछ नोट्स:

contentType: 'application/json',
  • जब आप JSONP का उपयोग करते हैं तो इसे अनदेखा कर दिया जाता है
  • आप एक GET अनुरोध कर रहे हैं। के प्रकार का वर्णन करने के लिए कोई अनुरोध निकाय नहीं है।
  • यह एक क्रॉस-ओरिजनल रिक्वेस्ट को गैर-सरल बना देगा, जिसका अर्थ है कि बुनियादी कोर अनुमतियाँ, साथ ही आपको पूर्व-उड़ान से निपटने की भी आवश्यकता है।

उसको हटाओ।

 dataType:'jsonp',
  • सर्वर JSONP के साथ प्रतिक्रिया नहीं दे रहा है।

हटाए इसे। (आप इसके बजाय JSONP के साथ सर्वर का जवाब दे सकते हैं, लेकिन कोर बेहतर है)।

responseType:'application/json',

यह jQuery.ajax द्वारा समर्थित विकल्प नहीं है। हटाए इसे।

xhrFields: {withCredentials: false},

यह डिफ़ॉल्ट है। जब तक आप इसे ajaxSetup के साथ सही पर सेट नहीं कर रहे हैं, इसे हटा दें।

  headers: {
    'Access-Control-Allow-Credentials' : true,
    'Access-Control-Allow-Origin':'*',
    'Access-Control-Allow-Methods':'GET',
    'Access-Control-Allow-Headers':'application/json',
  },
  • ये रिस्पॉन्स हेडर हैं। वे प्रतिक्रिया पर हैं, अनुरोध पर नहीं।
  • यह एक क्रॉस-ओरिजनल रिक्वेस्ट को गैर-सरल बना देगा, जिसका अर्थ है कि बुनियादी कोर अनुमतियाँ, साथ ही आपको पूर्व-उड़ान से निपटने की भी आवश्यकता है।

20

ज्यादातर मामलों में, अवरुद्ध प्रतिक्रिया को वेब पेज के व्यवहार को प्रभावित नहीं करना चाहिए और CORB त्रुटि संदेश को सुरक्षित रूप से अनदेखा किया जा सकता है। उदाहरण के लिए, चेतावनी उन मामलों में हो सकती है जब अवरुद्ध प्रतिक्रिया का शरीर पहले से ही खाली था, या जब प्रतिक्रिया एक ऐसे संदर्भ में वितरित होने वाली थी जो इसे संभाल नहीं सकता है (उदाहरण के लिए, एक HTML दस्तावेज़ जैसे 404 त्रुटि पृष्ठ एक टैग को दिया जा रहा है)।

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

मुझे अपने ब्राउज़र का कैश साफ़ करना था, मैं इस लिंक में पढ़ रहा था, कि, अगर रिक्वेस्ट को रिस्पॉन्स मिलता है, तो हमें यह चेतावनी एरर मिलती है। मेरे अनुरोध पर मुझे कुछ CORS मिल रहे थे, और इसलिए इस अनुरोध की प्रतिक्रिया खाली हो गई, मुझे बस इतना करना था कि ब्राउज़र का कैश साफ़ हो गया, और CORS दूर हो गया। मैं कॉर्स प्राप्त कर रहा था क्योंकि क्रोम ने कैश पर पोर्ट नंबर को सहेजा था, सर्वर सिर्फ स्वीकार करेगा localhost:3010और मैं localhost:3002कैश के कारण कर रहा था ।


12

हेडर 'एक्सेस-कंट्रोल-अलाउंस-ओरिजिन: *' के साथ रिटर्न रिस्पॉन्स नीचे दिए गए कोड को Php सर्वर रिस्पॉन्स के लिए चेक करें।

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

2
आपकी प्रतिक्रिया से मुझे बहुत मदद मिली !!! मैं बस आपको पर्याप्त धन्यवाद नहीं दे सकता। मैं शोध करना जारी रखूंगा कि "एक्सेस कंट्रोल इजाजत उत्पत्ति" क्या करती है इसलिए मुझे यह समझ में आ रहा है लेकिन मैं सिर्फ PHP वेब सेवा बनाने की मूल बातें सीख रहा हूं और इससे मुझे ऐसे मदद मिली जैसे आपको विश्वास नहीं होगा। धन्यवाद!!!
एडम लॉरी

यह समस्या को बिल्कुल भी संबोधित नहीं करता है। इसके साथ एक प्रतिक्रिया भेजने के कारण यह एक CORB त्रुटि Content-Type: application/jsonहै। ओपी का कोड पहले से ही ऐसा करना चाहिए।
क्वेंटिन

1
@ क्वेंटिन, ??? सामान्य ज्ञान बताता है कि जब तक आपके पास अनुमति मूल है, ब्राउज़र किसी भी संदिग्ध हेडर / बॉडी की परवाह किए बिना अनुरोध की अनुमति देगा।
पचेरियर

7

आपको सर्वर की तरफ CORS जोड़ना होगा:

यदि आप फिर नोडज का उपयोग कर रहे हैं :

पहले आपको नीचे दिए गए कमांड का उपयोग करके इंस्टॉल करना होगा 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
यदि आपको अपनी समस्या को ठीक करने के लिए एक एक्सन को जोड़ने की आवश्यकता है, तो आप सर्वर-साइड पर अनुरोध को गलत तरीके से संभाल रहे हैं। सिर्फ एक नोट।
अलेक्जेंडर फॉक

2
यह पूछना अक्षम है कि मेरा उपयोगकर्ता आधार एक अजीब क्रोम एक्सटेंशन स्थापित करता है। अन्य ब्राउज़रों के बारे में क्या?
इज़राइल रोड्रिगेज

2
हालांकि यह उत्तर दीर्घकालिक समस्या को हल नहीं करता है, लेकिन यह इस प्लगइन का उपयोग कर रहा था जो मेरे सहकर्मियों को सत्यापित करता था कि यह एक कोर मुद्दा था। तो उसके लिए उत्थान!
कोल्डबेन

2
@VladimirNul का मूल जवाब क्रोम एक्सटेंशन के बारे में था। शुभम ने फिर से लिखा। कृपया इतिहास जांचें।
इज़राइल रोड्रिगेज

3
यहां कुछ भ्रम है। ओपी कॉर्ब का उल्लेख कर रहा है न कि कॉर्स का।
मशीन

3

यह सवाल से स्पष्ट नहीं है, लेकिन यह मानते हुए कि यह एक विकास या परीक्षण ग्राहक पर कुछ हो रहा है, और यह देखते हुए कि आप पहले से ही फिडलर का उपयोग कर रहे हैं आप फिडलर को एक अनुमति प्रतिक्रिया के साथ जवाब दे सकते हैं:

  • फ़िडलर में समस्या अनुरोध का चयन करें
  • AutoResponderटैब खोलें
  • Add Ruleनियम पर क्लिक करें और उसे संपादित करें:
    • विधि: विकल्प सर्वर यूआरएल यहाँ , उदाहरण के लिएMethod:OPTIONS http://localhost
    • *CORSPreflightAllow
  • जाँच Unmatched requests passthrough
  • जाँच Enable Rules

एक दो नोट:

  1. जाहिर है कि यह केवल विकास / परीक्षण के लिए एक समाधान है जहां एपीआई सेवा को संशोधित करना संभव / व्यावहारिक नहीं है
  2. जांचें कि आपके पास तृतीय-पक्ष API प्रदाता के साथ कोई भी अनुबंध आपको यह करने की अनुमति देता है
  3. जैसा कि अन्य ने उल्लेख किया है, यह कोर कैसे काम करता है, का हिस्सा है और आखिरकार एपीआई सर्वर पर हेडर को सेट करना होगा। यदि आप उस सर्वर को नियंत्रित करते हैं, तो आप हेडर को स्वयं सेट कर सकते हैं। इस मामले में चूंकि यह एक तृतीय पक्ष सेवा है, इसलिए मैं केवल यह मान सकता हूं कि उनके पास कुछ तंत्र है जिसके माध्यम से आप उन्हें मूल साइट का URL प्रदान करने में सक्षम हैं और वे सही हेडर के साथ जवाब देने के लिए अपनी सेवा को अपडेट करेंगे।

3

यदि आप लोकलहोस्ट पर काम कर रहे हैं, तो यह कोशिश करें, यह एकमात्र विस्तार और तरीका है जो मेरे लिए काम किया है (कोणीय, केवल जावास्क्रिप्ट, कोई php)

https://chrome.google.com/webstore/detail/moesif-orign-cors-changer/digfbfaphojjndkpccljibejjbppifbc/related?hl=en


2

क्या आपने dataTypeअपने ajax अनुरोध में से बदलने की कोशिश की jsonpहै json? यह मेरे मामले में तय की।


2

क्रोम एक्सटेंशन में, आप उपयोग कर सकते हैं

chrome.webRequest.onHeadersReceived.addListener

सर्वर प्रतिक्रिया हेडर को फिर से लिखना। आप या तो मौजूदा हेडर को बदल सकते हैं या एक अतिरिक्त हेडर जोड़ सकते हैं। यह वह शीर्ष लेख है जो आप चाहते हैं:

Access-Control-Allow-Origin: *

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

मैं कॉर्ब मुद्दों पर अटका हुआ था, और इसने मेरे लिए इसे तय किया।


1
"क्रोम 72 से शुरू, अगर आपको क्रॉस ओरिजिन रीडिंग ब्लॉक करने से पहले प्रतिक्रियाओं को संशोधित करने की आवश्यकता है (CORB) प्रतिक्रिया को अवरुद्ध कर सकता है, तो आपको Opt_extraInfpSpec में 'extraHeaders' निर्दिष्ट करना होगा।" WebRequests doc से
swisswiss

0

रिस्पांस हेडर आमतौर पर सर्वर पर सेट किए जाते हैं। सेट 'Access-Control-Allow-Headers'करने के लिए 'Content-Type'सर्वर साइड पर


7
मैं 3rd पार्टी एपीआई का उपयोग कर रहा हूं। इसलिए मैं ऐसा नहीं कर सकता। कृपया मुझे कोई क्लाइंट साइड सॉल्यूशन दें।
जिग्नेश

4
सर्वर निर्णय लेता है कि क्या अनुमति दी जाए और क्या नहीं। केवल सर्वर के पास ही पहुंच है। क्लाइंट की ओर से प्रतिक्रिया हेडर को नियंत्रित करना एक सुरक्षा जोखिम है। क्लाइंट साइड का काम उचित अनुरोध भेजना है और फिर सर्वर द्वारा भेजे गए प्रतिक्रिया को प्राप्त करना है। : इस देखें stackoverflow.com/questions/17989951/...
lifetimeLearner007

48
यह कॉर्ब है, कोर नहीं।
जोकिन ब्रेंडन

0

क्रॉस-ऑरिज रीड ब्लॉकिंग (कॉर्ब), एक एल्गोरिथ्म जिसके द्वारा वेब पेज तक पहुँचने से पहले वेब ब्राउज़र द्वारा संदिग्ध क्रॉस-ऑरिजिनल संसाधन लोड को पहचाना और अवरुद्ध किया जा सकता है..यह ब्राउज़र को कुछ क्रॉस-ऑरिजिनल नेटवर्क प्रतिक्रियाओं को वितरित करने से रोकने के लिए डिज़ाइन किया गया है एक वेब पेज के लिए।

पहले सुनिश्चित करें कि ये संसाधन Content-TypeJSON MIME प्रकार - " text/json", " application/json", HTML MIME प्रकार - " text/html" के लिए एक सही " " नाम से दिए गए हैं।

दूसरा: 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

इस संदर्भ में उल्लेख के लायक एक किनारे मामला है: क्रोम (कुछ संस्करण, कम से कम) कोर के ऊपर स्थापित एल्गोरिथ्म का उपयोग करते हुए कॉर्स प्रीफ्लाइट्स की जाँच करता है। । IMO, यह थोड़ा मूर्खतापूर्ण है क्योंकि Preflights को CORB खतरे के मॉडल को प्रभावित नहीं करते हैं, और CORB को CORS के लिए रूढ़िवादी माना जाता है। इसके अलावा, एक कोर प्रीफ्लाइट का शरीर सुलभ नहीं है, इसलिए केवल चिड़चिड़ाहट की चेतावनी का कोई नकारात्मक परिणाम नहीं है।

वैसे भी, जांच लें कि आपके कॉर्स प्रीफ़्लाइट प्रतिक्रियाओं (विकल्प विधि प्रतिक्रियाएं) में एक शरीर नहीं है (204) । सामग्री प्रकार के अनुप्रयोग / ओकटेट-स्ट्रीम और लंबाई शून्य के साथ एक खाली 200 ने यहां भी अच्छा काम किया।

आप पुष्टि कर सकते हैं कि यह ऐसा मामला है जिसे आप संदेश बॉडी के साथ कॉर्ब चेतावनियों बनाम विकल्प प्रतिक्रियाओं की गिनती करके मार रहे हैं।


0

ऐसा लगता है कि 200 के साथ एक खाली प्रतिक्रिया भेजते समय यह चेतावनी हुई थी।

मेरे कॉन्फ़िगरेशन में यह .htaccessक्रोम पर चेतावनी प्रदर्शित करता है:

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

मेरे क्रोम एक्सटेंशन के साथ भी यही समस्या थी। जब मैंने इस भाग में अपनी अभिव्यक्ति "content_scripts" विकल्प को जोड़ने का प्रयास किया:

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

और मैं अपने प्रकट "परमिसन" से दूसरे भाग को हटा देता हूं:

"https://*/"

केवल जब मैं इसे हटाता हूं तो मेरे एक एक्सएचआर रीक्टेस्ट पर कॉर्ब गायब हो जाता है।

सबसे बुरी बात यह है कि मेरे कोड में कुछ XHR प्रतिक्षेप हैं और उनमें से केवल एक ही CORB त्रुटि प्राप्त करना शुरू करता है (क्यों CORB अन्य XHR पर मुझे सूचित नहीं करता है; मुझे नहीं पता? क्यों परिवर्तन इस त्रुटि को coused करता है जो मुझे नहीं पता है)। इसलिए मैंने कुछ घंटों के दौरान बार-बार पूरे कोड का निरीक्षण किया और बहुत समय गंवा दिया।


सर्वर साइड पर हेडर के साथ कुछ समस्या थी। मैं अपना ASP.NET रिटर्न मान बदलता हूं: सार्वजनिक async टास्क <string> Get (string TM) वापसी मूल्य एक पल पहले था JSON (सामग्री प्रकार मुझे लगता है कि "एप्लिकेशन / json") और अब यह अन्य (पाठ हो सकता है) / सादे ")। और इससे मदद मिलती है। अब मैं "https: // * /" पर "अनुमतियाँ" प्रकट करता हूं और यह काम करता है।
Олег Оитрень

-3

यदि आप इसे सफारी में करते हैं तो इसमें कोई समय नहीं लगता है, बस डेवलपर मेनू को प्राथमिकताएं >> गोपनीयता से सक्षम करें, और विकसित मेनू से "क्रॉस-ऑरिजनल प्रतिबंध को अक्षम करें" को रद्द करें। यदि आप केवल स्थानीय चाहते हैं, तो आपको केवल डेवलपर मेनू को सक्षम करना होगा, और विकसित मेनू से "स्थानीय फ़ाइल प्रतिबंध अक्षम करें" का चयन करना होगा।

और OSX में टर्मिनल खोलें और चलाएं:

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

- OSX पर Chrome 49+ परuser-data-dir आवश्यक है

लिनक्स रन के लिए:

$ 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"])

समस्या यह है कि, अंदर की वस्तु callbackएक json सरणी के बजाय एक सही json वस्तु होनी चाहिए। इसलिए मैंने कुछ सर्वर कोड को संशोधित किया और इसका प्रारूप बदला:

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

ब्राउज़र ने संशोधन के बाद प्रतिक्रिया को खुशी से स्वीकार किया।


callback(["apple", "peach"])पूरी तरह से वैध JSONP है, और ठीक काम किया है जब मैं यह मूल भर में परीक्षण किया।
क्वेंटिन

-4

यदि आप google chrome में समस्या का सामना कर रहे हैं तो "Moesif CORS" एक्सटेंशन इंस्टॉल करने का प्रयास करें। चूँकि यह क्रॉस ओरिजिनल रिक्वेस्ट है, इसलिए क्रोम को रिस्पॉन्स स्टेटस कोड 200 होने पर भी कोई प्रतिक्रिया स्वीकार नहीं कर रहा है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.