如何删除 CORB 警告?
Posted
技术标签:
【中文标题】如何删除 CORB 警告?【英文标题】:How can I remove the CORB warning? 【发布时间】:2019-08-04 20:13:24 【问题描述】:Chrome 一直工作到版本 73。现在它向我抛出了一个 CORB 警告并阻止我的 chrome 扩展程序运行。
这是我的ajax jquery代码,没什么特别的
$.ajax(
url: this.url + "api/users",
type: 'get',
data: account_id: this.account_id(), user_id: this.user_id(), person_id: person_id ,
success: function (data)
//do stuff
);
我确实注意到,如果我删除 x-content-type-options 标头以使其不再显示“nosniff”,我可以返回一些 Ajax 请求,但不能返回其他请求。不确定这是否意味着什么,但我注意到返回数组的 json 请求有效,但其他请求没有。
remove_keys = %w(X-Content-Type-Options)
response.headers.delete_if|key| remove_keys.include? key
['id' : '123'] <-worked
'id' : '123' <- did not work (not sure if means anything)
来自 chrome 的完全错误
Cross-Origin Read Blocking (CORB) blocked cross-origin response https://ideas.test/api/users?token=W9BDdoiKcXLWSHXWySnwdCV69jz2y&account_id=3098355&user_id=john%40gmail.com&person_id=21046915&sync=false&new=true with MIME type application/json. See https://www.chromestatus.com/feature/5629709824032768 for more details.
响应的标题
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: x-auth_token
Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD
Access-Control-Allow-Origin: chrome-extension://mhikhjencpecbhelhjgdcgpdhlhdlhjh
Access-Control-Expose-Headers:
Access-Control-Max-Age: 1728000
请求标头
Provisional headers are shown
Accept: */*
Origin: chrome-extension://mhikhjencpecbhelhjgdcgpdhlhdlhjh
Referer: https://3.basecamp.com/
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
AppleWebKit/537.36 (Khtml, like Gecko) Chrome/73.0.3683.75 Safari/537.36
我怎样才能让响应正文返回而不用 chrome 删除由于 CORB 而导致的正文?
【问题讨论】:
我的扩展也有同样的问题,对于使用外部 API 的扩展来说,它可能会成为现实...... 嗨,你解决了吗?目前我在 OSX 上运行 Chrome 使用: open -a "Google Chrome" --args --disable-web-security --user-data-dir .........这解决了这个问题,但我我宁愿不这样做。 好的,我通过在我的 .htaccess 中添加 Header set Access-Control-Allow-Origin "*" 解决了我的问题。我想知道如何将其专门限制为mail.google.com。尝试将 * 替换为 mail.google.com - 无效。 另见***.com/questions/55153888/…和chromium.org/Home/chromium-security/… 【参考方案1】:您似乎将 CORS 标头放入请求中。您需要将它们放在响应中。
【讨论】:
你的意思是从最后一个标题部分开始?抱歉,我相信这些实际上是响应标头。您可以从 ajax 请求中看到我没有在请求中放置任何标头。 @JohnPollard 那些(User-Agent
、Referer
等)绝对是请求标头。
你是对的,其中一些是正确的。我修复了代码。抱歉,为了解决这个问题花了很长时间!【参考方案2】:
我找到了解决方法。对某人来说可能是矫枉过正,但我花了 15 分钟来解决所有问题。在您的内容脚本中,将所有 ajax 调用包装到一个函数中:
将 ajaxGet 函数添加到您的内容脚本中:
function ajaxGet(data)
return new Promise(function (resolve, reject)
chrome.runtime.sendMessage(action: 'ajaxGet', data: data, function (response)
console.log(response)
if(response&&!response.statusText)//Might need some work here
resolve(response);
else
reject(response)
);
);
然后在你的 background.js 中添加一个监听器:
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse)
if(request.action=="ajaxGet")
$.ajax(request.data).then(sendResponse,sendResponse)
return true //telling chrome to wait till your ajax call resolves
)
代替
$.ajax(
url: this.url + "api/user_boards",
type: 'get',
data: account_id: this.account_id()
)
打电话
ajaxGet(
url: this.url + "api/user_boards",
type: 'get',
data: account_id: this.account_id()
).then(onSuccess, onError) //handle response from here
如果你不想在你的 background.js 中使用 jquery,你可以调用 Xhr。像这样的:
var data = JSON.stringify(false);
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function ()
if (this.readyState === this.DONE)
console.log(this.responseText);
sendResponse(this.responseText)
else
//handle errors
);
xhr.open("GET", request.data.url);
xhr.send(data);
您必须自己解决标题。
【讨论】:
【参考方案3】:Chrome 73 注入了一些新的安全性。只需尝试使用chrome.runtime.sendMessage
将您的xHTTP 请求移动到您的后台脚本,并使用SendResponse
回调获得响应。
在内容或弹出脚本中,将 ajax 替换为:
chrome.runtime.sendMessage(
action: "check", data: /* params for url */,
// callback with url response
function(response)
if( response.success )
var myDataFromUrl = response.data;
...
else
console.log('Error with `check`,', response.data);
);
来自后台脚本:
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse)
var url = 'https://mysyte.com/';
if(request.action === 'check' )
url = url + 'check'
ajax( url, request.data,
success: function( d )
sendResponse(success: true, data: d);
,
error : function( d )
sendResponse(success: false, data: d);
);
);
function ajax( url, params, cbSuccess, cbError ) ...
【讨论】:
【参考方案4】:修复 CSP 和 CORS 问题后,我仍然收到关于 OPTIONS 方法调用的警告(这是为跨域调用完成的)。
我通过将 OPTIONS 方法调用(不返回任何数据)的内容类型设置为“application/octet-stream”来在服务器上修复它。没有更多警告!
【讨论】:
以上是关于如何删除 CORB 警告?的主要内容,如果未能解决你的问题,请参考以下文章