Ошибка: разрешение на доступ к ресурсу "документ"

У меня есть HTML-документ, содержащий iframe. Всякий раз, когда я пытаюсь получить или изменить этот iframe с помощью JS, я получаю Error: Permission denied to access property "document".

Я использую frame.contentWindow.document.body.innerHTML или frame.contentWindow.document.body.onload или аналогичные такие атрибуты для доступа или изменения iframe. (В данном коде iframe обозначается как frame.)

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

Ответ 1

Доступ к, а затем изменение веб-страниц в iframe других веб-сайтов называется Межсайтовый скриптинг или XSS, и это метод используемые злоумышленниками для охоты на ничего не подозревающих жертв.

Политика защиты от имени "Политика одинакового происхождения" реализована разработчиками браузеров для предотвращения такого поведения и произвольного выполнения JS-кода.

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

Примеры несовместимых страниц:

  • http://www.example.org и http://www.example2.com
  • http://abc.example.org и http://xyz.example.com
  • http://www.example.org и https://www.example.com

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

Например:
Если http://www.example.com хотел бы поделиться http://www.example.com/hello с http://www.example.org, заголовок может быть отправлен с документом, который выглядит следующим образом:

Access-Control-Allow-Origin: http://www.example.org

Чтобы отправить его с помощью HTML, просто поместите его в тег <META HTTP-EQUIV="...">, например:

<head>
    ...
    <META HTTP-EQUIV="Access-Control-Allow-Origin" CONTENT="http://www.example.org">
    ...
</head>

Ответ 2

Вы можете использовать postMessage

Окно 1 - получение

window.addEventListener("message", receiveMessage, false);

function receiveMessage(event)
{
  var origin = event.origin || event.originalEvent.origin; 
  // For Chrome, the origin property is in the event.originalEvent object.
  if (origin !== "http://example.org:8080")
    return;

  // ...
}

Окно - 2 Передача

var popup = window.open(...popup details...);
popup.postMessage(
       "The user is 'bob' and the password is 'secret'", 
       "https://secure.example.net"
);

Вам нужно создать другую пару для взаимодействия.