Подтвердить что ты не робот

Ошибка доступа "Access denied" при доступе к объекту document iframe

Для публикации форм AJAX в форме со многими параметрами я использую решение для создания iframe, отправляя форму ему POST, а затем получая доступ к контенту iframe. в частности, я обращаюсь к контенту следующим образом:

$("some_iframe_id").get(0).contentWindow.document

Я тестировал его, и он работал.

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

Я уверен, что он работал раньше. Кто-нибудь знает?

Если я не буду достаточно ясным: я отправляю в тот же домен. Таким образом, это не междоменный запрос. Я тестирую только IE.

P.S. Я не могу использовать простые ajax POST-запросы (не спрашивайте...)

4b9b3361

Ответ 1

Решил сам!

Проблема заключалась в том, что даже при отправке правильного ответа (проверяется с помощью Fiddler) он отправляется с кодом ошибки HTTP 500 (вместо 200).

Итак, получается, что если ответ отправляется с кодом ошибки, IE заменяет содержимое iframe сообщением об ошибке, загруженным с диска (res://ieframe.dll/http_500.htm), и это вызывает междоменный доступ отклонили ошибку.

Ответ 2

ошибки перекрестного домена, вызванные 3 вещами, когда дело касается iFrames:

  • откройте iFrame с другим URL (например, откройте www.foo.com) с родительской страницы (www.ooof.com)

  • разные порты (открытие iframe с url:), отличное от исходного порта

  • различные протоколы: открытие iFrame с HTTPS-url с родительской страницы, которая является HTTP

проверьте их, если вы столкнулись с этой проблемой.

Ответ 3

Моя проблема была в заголовке X-Frame-Options HTTP. Моя конфигурация Apache имеет значение:

Header always append X-Frame-Options DENY

Удаление его позволило ему работать. В частности, в моем случае я использовал транспорт iframe для jQuery с плагином загрузки файла jQuery для загрузки файлов в IE 9 и IE 10.

Ответ 4

Я знаю, что этот вопрос супер-старый, но я хотел бы упомянуть, что вышеупомянутый ответ сработал у меня: установка document.domain будет одинаковым на каждой странице - родительской и iframe-странице. Однако в моем поиске я нашел эту интересную статью:

http://softwareas.com/cross-domain-communication-with-iframes

Ответ 5

Обратите внимание, что если у вас есть iframe с src='javascript:void(0)', тогда javascript, например frame.document.location =..., не будет работать с ошибкой Access Denied в IE. Использует библиотеку javascript, которая взаимодействует с целевым фреймом. Несмотря на то, что местоположение, в котором он пытался изменить фрейм, находилось в том же домене, что и родительский, для iframe изначально был установлен javascript: void, который вызвал отказ в доступе к перекрестному домену.

Чтобы решить эту проблему, я создал на моем сайте страницу blank.html, и если мне нужно заранее объявить iframe, который изначально будет пустым, пока не будет изменен с помощью javascript, тогда я укажу его на пустую страницу, чтобы src='/content/blank.html' в той же области.

В качестве альтернативы вы можете полностью создать iframe через javascript, чтобы вы могли установить src при его создании, но в моем случае я использовал библиотеку, которая потребовала, чтобы iframe уже был объявлен на странице.

Ответ 6

В основном, эта ошибка возникает, когда документ в кадре и за пределами ii имеет разные домены. Поэтому, чтобы предотвратить использование браузеров с параллельными скриптами, отключите такое выполнение.

Ответ 7

если это проблема домена (или поддомена), такая как www.foo.com, отправив запрос на www.api.foo.com

на каждой странице вы можете установить

document.domain = www.foo.com

чтобы разрешать "междоменные" разрешения