Ошибка XSS «Заблокировал фрейм с источником для доступа к фрейму из другого источника» в сценарии контента для расширения Chrome

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

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

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

Blocked a frame with origin "https://www.youtube.com" from accessing a cross-origin frame.

Как я уже сказал, раньше это был способ получить 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"]
    }
],

Google изменил много вещей, связанных с разрешениями, и это не простое изменение.

epascarello 09.04.2019 07:12
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
797
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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.info(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;
  }
});

Хм. Это много изменений. Мне было интересно, могу ли я использовать document.referrer вместо этого?

c00000fd 09.04.2019 07:01

Кроме того, мне это не нужно для сценария background. Я вызываю его из скрипта .js, работающего под content_scripts в манифесте. (Я обновлю вопрос с подробностями.)

c00000fd 09.04.2019 07:04

Реферер может отсутствовать, а ваш iframe может быть глубже второго уровня. Что касается второго возражения, то я не понял, в чем проблема, не вижу ее как таковой.

wOxxOm 09.04.2019 07:17

Хорошо спасибо. Думаю, мне следует попробовать, если это также работает в content.js против предложенного вами background.js. (Если я правильно помню, они работали с разными разрешениями.)

c00000fd 09.04.2019 07:20

chrome.tabs недоступен в сценарии контента, поэтому вам нужен фоновый сценарий. Я до сих пор не понимаю, почему это проблема.

wOxxOm 09.04.2019 07:32

Вкратце идея заключается в том, что ваш сценарий содержимого запрашивает фоновый сценарий.

wOxxOm 09.04.2019 07:35

Другие вопросы по теме