Избегайте перекрестной политики происхождения через расширение Chrome - PullRequest
0 голосов
/ 15 октября 2018

Сайт A - это веб-сайт с <iframe>, содержащий сайт B. Он работает в браузере Chrome с расширением.

У меня есть контроль над расширением.Я хотел бы предоставить пользователю элементы управления для редактирования частей сайта B.

Следующее вызывается, когда пользователь нажимает кнопку на расширении.Намерение состоит в том, чтобы загрузить jQuery, чтобы я мог использовать его, нацелиться на iframe на странице, перейти в iframe, а затем изменить его цвет тела.

chrome.tabs.executeScript(null, {file: 'assets/jquery.min.js'}, function () {
  chrome.tabs.executeScript({
    code: "jQuery('iframe').contents().find('body').css('backgroundColor', 'red');"
  });
});

Сайт A и сайт B находятся в разных доменах, поэтомуначинает действовать та же политика происхождения. Стоит также отметить, что Сайт B не предоставил права доступа с перекрестным происхождением к сайту A. Я также не являюсь владельцем сайта A или сайта B, поэтому не могу изменить их политику перекрестного происхождения.

Я надеюсь, что при запуске с расширения у меня будет немного больше согласия от пользователя, чтобы он мог обойти ту же политику происхождения и выполнить вышеуказанное действие.

1 Ответ

0 голосов
/ 15 октября 2018

Если вы хотите, чтобы ваш скрипт вставлялся во фрейм, вы можете использовать опцию allFrames для внедрения кода во все фреймы страницы.

Перед запуском кода вам необходимо проверитьесли вы находитесь внутри A или B: вы можете сделать это, сравнив window.self с window.parent.В верхнем фрейме (A) это будет тот же объект, но внутри <iframe> (например, B) они будут другими.

Вот оно:

chrome.tabs.executeScript(null, {file: 'assets/jquery.min.js', allFrames: true}, function () {
    chrome.tabs.executeScript({
        code: "if (self != parent) jQuery('body').css('backgroundColor', 'red');",
        allFrames: true
    });
});

Вышекод будет введен как в A, так и в B, но будет выполняться только в B. Если несколько кадров находятся в A, вам также необходимо проверить, является ли кадр правильным, например, window.location.hostname.

...