Доступ до батьківської URL-адреси з iframe


187

Гаразд, у мене є сторінка, і на цій сторінці у мене є кадр. Що мені потрібно зробити, це на сторінці 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

а потім моя URL-адреса iframe

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

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


Чи можете ви просто передати його в URL-адресі кадру? Такі як<iframe src="url?parent=parent-url"></iframe>
Biagio Arobba

Відповіді:


21

Ви маєте рацію. Піддомени досі вважаються окремими доменами при використанні iframes. Можна передавати повідомлення за допомогою postMessage(...), але інші JS API навмисно робляться недоступними.

Також можна отримати URL-адресу залежно від контексту. Дивіться інші відповіді для отримання більш детальної інформації.


1
Добре, що просто дме. Але, принаймні, я знаю, що я не з глузду :( а, добре, план В. дякую. (І шкода, що не ставлю свої речі в теги, дякую за редагування)
chronofwar

9
як це бути обраною відповіддю? нижче є набагато кращі описи можливих рішень.
Анойз

1
Домовились! Відповідь нижче на 80 голосів набагато краща. Ця відповідь знаходиться у специфікації html.
Лігемер

4
Ви МОЖЕТЕ взаємодіяти між 2. Але ви повинні додати наступний скрипт і для батьків, і для iframe: <script> document.domain = "mydomain.com"; </script>
Джордж

2
"Дивіться інші відповіді для отримання більш детальної інформації." hahah Це так: у мене немає рішення, дивіться інші відповіді, але також приймайте свою відповідь.
Мілад

371

Так, доступ до URL-адреси батьківської сторінки заборонено, якщо рамка рамки та головна сторінка не в одному (під) домені. Однак якщо вам просто потрібна URL-адреса головної сторінки (тобто URL-адреси браузера), ви можете спробувати це:

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

Примітка:

window.parent.locationдозволено; це дозволяє уникнути помилки безпеки в ОП, яка викликана доступом до hrefвластивості: window.parent.location.hrefвикликає "Заблокований кадр з початком ..."

document.referrerпосилається на "URI сторінки, яка пов’язана з цією сторінкою". Це може не повернути документ, що містить документ, якщо якесь інше джерело визначає iframeмісце, наприклад:

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

document.locationпосилається на "об'єкт Location, який містить інформацію про URL-адресу документа"; імовірно, поточний документ, тобто відкрита в даний час рамка. Коли window.location === window.parent.location, тоді рамки iframe hrefтакі ж, як і батьки, що містять href.


1
@jepser це тому, що ваш iframe знаходиться всередині цієї рамки. ви ніколи не матимете доступу до верхнього кадру з цим посередині. вкладені міждоменні iframe не так на багатьох рівнях. але, можливо, ви зможете обійти це, якщо встановити document.domainверхній каркас і внутрішній. може бути.
gcb

2
Або, трохи більш компактно:var url = (parent !== window) ? document.referrer : document.location;
thekingoftruth

2
Зверніть увагу, що він не працює, якщо контейнер знаходиться на вашому localhost (або загалом, якщо ця сторінка не відкритий веб-сервером) або викликається файлом: //.
Гійом Ренульт

5
Слід зазначити, що це може перемогти Referer-Policyзаголовок.
Ден Аткінсон

2
Це не схоже на роботу з прикордонного браузера - реферер буде символом нового рядка .. stackoverflow.com/questions/24169219 / ...
Davide Орацио Montersino

51

Щойно я виявив вирішення настільки простої проблеми, і все ще ніде не знайшов дискусій, які б згадували про неї. Це вимагає контролю над батьківським кадром.

У своєму 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


Ця відповідь у поєднанні з stackoverflow.com/a/7739035/216084 виконує роботу.

2
Це була чудова пропозиція. Для тих, хто пише батьківський HTML-код iframe, це буде законопроектом. Ми використовували щось дуже схоже в нашому піксельному програмному забезпеченні.
Лігемер

Дякую!! Це ефективна робота, яка досі дотримується правил між веб-сайтів.
thetherSide

Але ви переписуєте всі URL-адреси в html на сервері? Тому що в іншому випадку, коли користувач натисне посилання в iFrame, він все ще не буде доступний.
Roel

@Roel ви можете їх записати в серверний час (по суті, "жорсткий код" ця відповідь) або цю відповідь, яку ви можете зробити в javascript, наприклад, після завантаження сторінки в неї вводиться потрібний кадр.
rogerdpack

34

Якщо ваш кадр iframe з іншого домену ((міждоменний), вам просто потрібно буде скористатися цим:

var currentUrl = document.referrer;

і - ось у вас головна URL-адреса!


У моєму випадку це не спрацювало, оскільки я думаю, що сам iFrame динамічно генерувався або робив якісь інші хитрощі. Я не отримав відповіді, яку я очікував у будь-якому випадку.
Маскі

це має працювати у всіх браузерах. Якщо не в нових браузерах, якщо ви надсилаєте параметри Sandboxing, але я сумніваюся, що це так. Це працює незалежно від крос-домену.
gcb

Якщо сторінка всередині iframe перезавантажується через javascript (наприклад window.location.reload(true)), це більше не працює. Тоді референс - це URL самого iframe.
mori

20

Для сторінок одного домену та іншого піддомену ви можете встановити document.domainвластивість за допомогою JavaScript.

І батьківський кадр, і кадр iframe потребують встановити їх document.domain на те, що є загальним для них.

тобто, 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


3
Будь ласка, прийміть це як відповідь, тепер, коли це і можливо, і ця відповідь з’являється в пошукових запитах Google.
Метаграф

17

Працює наступний рядок: document.location.ancestorOrigins[0]цей повертає доменне ім'я предка.


Після змін, внесених до Chrome, тепер це правильна відповідь для багатьох браузерів.
Ден Аткінсон

Не повна URL-адреса, хоча. Тільки домен
TheMaster

document.location.ancestorOriginsповертається undefinedдля мене
Мігель Мота

Що стосується підтримки веб-переглядача, зокрема, з липня 2020 року, pretstorOrigins ще не підтримується у Firefox через проблеми конфіденційності. Запит та обговорення функції Bugzilla: bugzilla.mozilla.org/show_bug.cgi?id=1085214 . Підтримка веб-переглядачів: caniuse.com/#search=ancestorOrigins
colin moock


2

У мене були проблеми з цим. Якщо ви використовуєте таку мову, як php, коли ваша сторінка спочатку завантажується в рамку iframe $_SERVER['HTTP_REFFERER']та встановіть її на змінну сеансу.

Таким чином, коли сторінка завантажується в iframe, ви знаєте повний батьківський URL-рядок і рядок запиту сторінки, яка її завантажила. Завдяки безпеці перехресного веб-переглядача це головний біль, розраховуючи на window.parent, що завгодно, якщо ви різні домени.


2
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
Якщо ви знаходитесь поза рамкою iframe, тоді ви запускаєте сценарій ON батьківський кадр, вам нічого не потрібно перевіряти.
Art3mix

1

Я не міг отримати попереднє рішення для роботи, але я виявив, що якщо я встановив scr iframe, наприклад, 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

Проблема PHP $ _SERVER ['HTTP_REFFERER'] полягає в тому, що він дає повністю кваліфікований URL-адресу сторінки, яка привела вас до батьківської сторінки. Це не те саме, що сама батьківська сторінка. Гірше, іноді немає http_referer, оскільки людина вводить URL-адресу батьківської сторінки. Отже, якщо я потрапляю на вашу батьківську сторінку з yahoo.com, то yahoo.com стає http_referer, а не вашою сторінкою.


1

Я виявив, що випадки, коли $_SERVER['HTTP_REFERER']це не працює (я дивлюся на тебе, Сафарі), $_SERVER['REDIRECT_SCRIPT_URI']були корисною резервною копією.


0

У хромі можна використовувати location.ancestorOrigins Він поверне всі батьківські URL-адреси


0

Я знаю, що він дуже старий, але це дує, що ніхто не рекомендував просто передавати файли cookie з одного домену в інший. Під час використання субдоменів ви можете ділитися файлами cookie з базового домену на всі піддомени, лише встановивши файли cookie на URL.basedomain.com

Тоді ви можете обмінюватися будь-якими необхідними даними за допомогою файлів cookie.


-1

Це працювало для мене, щоб отримати доступ до URL-адреси iframe src.

window.document.URL

-4

Отримайте всі функції батьківського iframe та HTML

var parent = $(window.frameElement).parent();
        //alert(parent+"TESTING");
        var parentElement=window.frameElement.parentElement.parentElement.parentElement.parentElement;
        var Ifram=parentElement.children;      
        var GetUframClass=Ifram[9].ownerDocument.activeElement.className;
        var Decision_URLLl=parentElement.ownerDocument.activeElement.contentDocument.URL;

Я не думаю, що ви можете розширити цю відповідь для тих із нас, хто не використовує jQuery (варто зазначити, що зростаюча кількість, оскільки jQuery за останні кілька років стає непотрібною). Принаймні, я пропоную зрозуміти, що ця відповідь залежить від jQuery, і ОП взагалі не згадує jQuery.
Карнікс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.