如何避免Chrome Web扩展程序中的跨域读取阻止(CORB)

时间:2019-02-20 12:41:20

标签: google-chrome-extension cross-origin-read-blocking

我写了chrome web extension来避免在开发自己的Web应用程序时出现CORS限制。该扩展程序是开发人员的工具,用于将请求从源URL代理到目标URL。

这样的扩展核心代码,因此开发人员可以在我的页面上开发页面  网站并向其服务器端提出请求,而不受CORS的限制:

chrome.webRequest.onBeforeRequest.addListener(details => {
  let redirectUrl = '';
  //...
  redirectUrl = details.url.replace(TNT.validRules[i].source, TNT.validRules[i].dest);
 return {redirectUrl}
}, {urls: ['<all_urls>']}, ['blocking']);


chrome.webRequest.onHeadersReceived.addListener(details => {
  details.responseHeaders.map(item => {
    if (item.name.toLowerCase() == 'Access-Control-Allow-Origin'.toLowerCase()) {
      item.value = '*'
    }
  })
  return {responseHeaders};
}, {urls: ['<all_urls>']}, ["blocking", "responseHeaders"]);

但是最新的Chrome 72无法代理该请求。控制台错误是:

  

跨源读取阻止(CORB)阻止了跨源响应   https://xxxxxxx.com/abc.json?siteId=69   MIME类型为application / json。看到   https://www.chromestatus.com/feature/5629709824032768了解更多   详细信息。

2 个答案:

答案 0 :(得分:2)

请参阅Moesif联合创始人提出的此问题。

https://bugs.chromium.org/p/chromium/issues https://bugs.chromium.org/p/chromium/issues/detail?id=933893

基本上,根据他与Chronium工程师的讨论,您应该添加extraHeaders 添加添加侦听器时的其他选项,这将使此触发器更靠近网络,并在触发CORB之前注入标头。

chrome.webRequest.onHeadersReceived.addListener(details => {
  const responseHeaders = details.responseHeaders.map(item => {
    if (item.name.toLowerCase() === 'access-control-allow-origin') {
      item.value = '*'
    }
  })
  return { responseHeaders };
}, {urls: ['<all_urls>']}, ['blocking', 'responseHeaders', 'extraHeaders'])

顺便说一句,这里有一些自我提升。您为什么不只使用我们的CORS工具

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

它已经是功能最齐全的完整CORS工具。

答案 1 :(得分:1)

我在Google文档中找到了答案:

避免内容脚本中的跨域获取

旧内容脚本,进行跨域获取:

var itemId = 12345;
var url = "https://another-site.com/price-query?itemId=" +
         encodeURIComponent(request.itemId);
fetch(url)
  .then(response => response.text())
  .then(text => parsePrice(text))
  .then(price => ...)
  .catch(error => ...)

新的内容脚本,要求其背景页面获取数据:

chrome.runtime.sendMessage(
    {contentScriptQuery: "queryPrice", itemId: 12345},
    price => ...);

新的扩展程序后台页面,从已知的URL获取并中继数据:

chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    if (request.contentScriptQuery == "queryPrice") {
      var url = "https://another-site.com/price-query?itemId=" +
              encodeURIComponent(request.itemId);
      fetch(url)
          .then(response => response.text())
          .then(text => parsePrice(text))
          .then(price => sendResponse(price))
          .catch(error => ...)
      return true;  // Will respond asynchronously.
    }
  });

https://www.chromium.org/Home/chromium-security/extension-content-script-fetches