it-swarm.com.ru

Доступ к родительскому URL из iframe

Хорошо, у меня есть страница, и на этой странице у меня есть iframe. Что мне нужно сделать, это на странице iframe, узнать, что URL на главной странице. 

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

parent.document.location
parent.window.document.location
parent.window.location
parent.document.location.href

... или другие подобные комбинации, так как кажется, что есть несколько способов получить одну и ту же информацию. 

В любом случае, вот в чем проблема. Мой iframe находится в том же домене, что и главная страница, но не в том же домене SUB. Так, например, у меня есть

http: // www.mysite.com/pageA.html

а затем мой iframe URL 

http: // qa-www.mysite.com/pageB.html

Когда я пытаюсь получить URL-адрес из pageB.html (страницы iframe), я получаю ту же ошибку отказа в доступе. Таким образом, кажется, что даже субдомены считаются межсайтовым скриптингом, это правильно, или я что-то не так делаю?

153
chronofwar

Ты прав. Субдомены по-прежнему считаются отдельными доменами при использовании фреймов. Можно передавать сообщения, используя postMessage(...) , но другие JS API намеренно сделаны недоступными.

Также все еще возможно получить URL в зависимости от контекста. Смотрите другие ответы для более подробной информации.

19
Dan Herbert

Да, доступ к URL родительской страницы не разрешен, если iframe и главная страница не находятся в одном (суб) домене. Однако, если вам просто нужен URL-адрес главной страницы (то есть URL-адрес браузера), вы можете попробовать это:

var url = (window.location != window.parent.location)
            ? document.referrer
            : document.location.href;

Заметка:

window.parent.location разрешен; это позволяет избежать ошибки безопасности в OP, которая вызвана доступом к свойству href: window.parent.location.href вызывает «Заблокирован кадр с Origin ...»

document.referrer ссылается на «URI страницы, которая ссылается на эту страницу». Это может not вернуть документ содержащий, если какой-то другой источник определил местоположение iframe, например:

  • Контейнер iframe @ Домен 1
  • Отправляет дочерний iframe в домен 2
  • Но в дочернем iframe ... Домен 2 перенаправляет в Домен 3 (то есть для аутентификации, может быть, SAML), а затем Домен 3 направляет назад в Домен 2 (то есть через форму представления (), стандартная техника SAML )
  • Для дочернего iframe document.referrer будет Домен 3, а не содержащий Домен 1

document.location ссылается на «объект Location, который содержит информацию об URL документа»; предположительно документ current, то есть iframe, открытый в данный момент. Когда window.location === window.parent.location, тогда href iframe является same как href содержащего родителя.

307
Vaibhav

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

В вашем iFrame говорят, что вы хотите этот iframe: src = "http://www.example.com/mypage.php"

Ну, вместо HTML, чтобы указать iframe, используйте javascript для построения HTML-кода для вашего iframe, получите родительский URL через javascript «во время сборки» и отправьте его в качестве параметра GET url в строке запроса вашей цели src, например так:

<script type="text/javascript">
  url = parent.document.URL;
  document.write('<iframe src="http://example.com/mydata/page.php?url=' + url + '"></iframe>');
</script>

Затем найдите себе функцию синтаксического анализа URL-адреса javascript, которая анализирует строку URL-адреса, чтобы получить переменную url, которую вы ищете, в данном случае это «url».

Я нашел отличный анализатор строк URL здесь: http://www.netlobo.com/url_query_string_javascript.html

45
Gregory Lewis

Если ваш iframe из другого домена (кросс-домен), вам просто нужно использовать это:

var currentUrl = document.referrer;

и - здесь у вас есть основной URL!

27
ParPar

Для страниц в одном и том же домене и другом поддомене вы можете установить свойство document.domain через javascript.

И родительский фрейм, и iframe должны установить в свой document.domain что-то общее между ними.

i.e .www.foo.mydomain.com и api.foo.mydomain.com могут использовать либо foo.mydomain.com, либо просто mydomain.com и быть совместимыми (нет, вы не можете установить для них обоих значение com, из соображений безопасности ...)

также обратите внимание, что document.domain - это улица с односторонним движением. Попробуйте выполнить следующие три утверждения по порядку:

// assume we're starting at www.foo.mydomain.com
document.domain = "foo.mydomain.com" // works
document.domain = "mydomain.com" // works
document.domain = "foo.mydomain.com" // throws a security exception

Современные браузеры также могут использовать window.postMessage для общения между источниками, но он не работает в IE6 . https://developer.mozilla.org/en/DOM/window.postMessage

16
user409021

Будет работать следующая строка: document.location.ancestorOrigins[0] эта возвращает имя домена предка.

3
Robert-Jan Kuyper

У меня были проблемы с этим. Если вы используете такой язык, как php, когда ваша страница впервые загружается в iframe, захватите $_SERVER['HTTP_REFFERER'] и установите для нее переменную сеанса.

Таким образом, когда страница загружается в iframe, вы знаете полный родительский URL и строку запроса страницы, которая его загрузила. С кросс-браузерной безопасностью это немного головная боль в расчете на window.parent, если вы используете разные домены.

2
Hyzer Deeds
var url = (window.location != window.parent.location) ? document.referrer: document.location;

Я обнаружил, что предложенный выше пример ранее работал, когда скрипт выполнялся в iframe, однако он не Получал URL, когда скрипт выполнялся вне iframe, Потребовалась небольшая корректировка:

var url = (window.location != window.parent.location) ? document.referrer: document.location.href;
2
user3523340

Проблема с PHP $ _SERVER ['HTTP_REFFERER'] заключается в том, что он дает полный URL-адрес страницы, которая привела вас на родительскую страницу. Это не то же самое, что родительская страница, сама по себе. Хуже того, иногда нет http_referer, потому что человек набрал URL-адрес родительской страницы. Итак, если я попаду на вашу родительскую страницу с yahoo.com, то yahoo.com станет http_referer, а не вашей страницей.

1
TARKUS

Я не мог заставить работать предыдущее решение, но я обнаружил, что если я установлю iframe scr, например, с помощью http:otherdomain.com/page.htm?from=thisdomain.com/thisfolder, то смогу в извлечении iframe thisdomain.com/thisfolder, используя следующий javascript:

var myString = document.location.toString();
var mySplitResult = myString.split("=");
fromString = mySplitResult[1];
1
Paul

Я обнаружил, что в случаях, когда $_SERVER['HTTP_REFERER'] не работает (я смотрю на вас, Safari), $_SERVER['REDIRECT_SCRIPT_URI'] была полезной резервной копией.

1
Dan

В chrome можно использовать location.ancestorOrigins Он вернет все родительские URL 

0
Gena Moroz

Я знаю, что он очень старый, но это поражает меня, никто не рекомендовал просто передавать куки с одного домена на другой. Поскольку вы используете субдомены, вы можете делиться файлами cookie с базового домена на все субдомены, просто установив куки в URL .basedomain.com

Затем вы можете поделиться любыми данными через куки.

0
Bruce