Ошибка XSS «Заблокирован фрейм с источником при доступе к фрейму с несколькими источниками» в скрипте содержимого для расширения Chrome - PullRequest
0 голосов
/ 09 апреля 2019

У меня уже есть это расширение в магазине Google Chrome.После выполнения технического обслуживания я заметил, что следующая строка из content.js (сценарий содержимого):

//Get top document URL (that is the same for all IFRAMEs)
var strTopURL = window.top.document.URL;

теперь выдает следующее исключение, когда загруженная страница содержит IFRAME:

Заблокирован фрейм с происхождением "https://www.youtube.com" от доступа к фрейму перекрестного происхождения.

Как я уже говорил, раньше был способ получить верхURL документа для вашего расширения (из content script). Так какой же приемлемый способ сделать это сейчас?

PS. Опять же, я говорю о расширении Google Chrome (а не просто о обычном JS настраницы.)

РЕДАКТИРОВАТЬ: Этот сценарий выполняется под content_scripts в manifest.json, который определяется как:

"content_scripts": [
    {
        "run_at": "document_end",
        "all_frames" : true,
        "match_about_blank": true,
        "matches": ["http://*/*", "https://*/*"],
        "js": ["content.js"]
    }
],

1 Ответ

1 голос
/ 09 апреля 2019

Сценарий контента должен попросить ваш фоновый скрипт сделать это через обмен сообщениями:

chrome.runtime.sendMessage('getTopUrl', url => {
  // use the URL here inside the callback or store in a global variable
  // to use in another event callback that will be triggered in the future
  console.log(url);
});
// can't use it right here - because the callback runs asynchronously

Фоновый скрипт должен быть объявлен в manifest.json:

"background": {
  "scripts": ["background.js"],
  "persistent": false
},

Вам также понадобятся определенные разрешения для URL-адресов в manifest.json или разрешите все URL-адреса:

"permissions": ["<all_urls>"]

И слушатель в фоновом скрипте:

chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
  if (msg === 'getTopUrl') {
    chrome.tabs.get(sender.tab.id, tab => sendResponse(tab.url));
    // keep the message channel open for the asynchronous callback above
    return true;
  }
});
...