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

Как реализовать доступ к URL-адресам Cross Domain из iframe с помощью Javascript?

Мне нужно получить доступ к URL родительского домена из моего iframe, который находится в другом домене.

Например, "example.com" - это мой веб-сайт с IFrame из другого родительского домена, например "google.com". Здесь мне нужно получить доступ к URL родительского домена с моего example.com. То есть, мне нужно получить URL-адрес "google.com" в моем домене "example.com". Кроме того, родительский домен не может быть жестко закодирован.

Я попытался использовать следующий код:

window.parent.location.href()

но это приводит к ошибке Access denied. Как реализовать это правильно, чтобы достичь этого?

4b9b3361

Ответ 1

Вы можете попробовать и проверить рефератора, который должен быть родительским сайтом, если вы являетесь iframe

вы можете сделать это вот так:

var href = document.referrer;

Ответ 2

Вы можете взглянуть на эти вопросы/ответы; они могут дать вам информацию о вашей проблеме:

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


Страница Страница того же самого источника на wikipedia дает некоторую информацию об этой мера безопасности:

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

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

Ответ 3

Вместо использования реферера вы можете реализовать window.postMessage для связи через iframes/windows через домены.

Вы отправляете в window.parent, а затем родитель возвращает URL-адрес.
Это работает, но для этого требуется асинхронная связь.

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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title></title>

    <!--
    <link rel="shortcut icon" href="/favicon.ico">


    <link rel="start" href="http://benalman.com/" title="Home">

    <link rel="stylesheet" type="text/css" href="/code/php/multi_file.php?m=benalman_css">

    <script type="text/javascript" src="/js/mt.js"></script>
    -->
    <script type="text/javascript">
        // What browsers support the window.postMessage call now?
        // IE8 does not allow postMessage across windows/tabs
        // FF3+, IE8+, Chrome, Safari(5?), Opera10+

        function SendMessage()
        {
            var win = document.getElementById("ifrmChild").contentWindow;

            // http://robertnyman.com/2010/03/18/postmessage-in-html5-to-send-messages-between-windows-and-iframes/


            // http://stackoverflow.com/questions/16072902/dom-exception-12-for-window-postmessage
            // Specify origin. Should be a domain or a wildcard "*"

            if (win == null || !window['postMessage'])
                alert("oh crap");
            else
                win.postMessage("hello", "*");
            //alert("lol");
        }



        function ReceiveMessage(evt) {
            var message;
            //if (evt.origin !== "http://robertnyman.com")
            if (false) {
                message = 'You ("' + evt.origin + '") are not worthy';
            }
            else {
                message = 'I got "' + evt.data + '" from "' + evt.origin + '"';
            }

            var ta = document.getElementById("taRecvMessage");
            if (ta == null)
                alert(message);
            else
                document.getElementById("taRecvMessage").innerHTML = message;

            //evt.source.postMessage("thanks, got it ;)", event.origin);
        } // End Function ReceiveMessage




        if (!window['postMessage'])
            alert("oh crap");
        else {
            if (window.addEventListener) {
                //alert("standards-compliant");
                // For standards-compliant web browsers (ie9+)
                window.addEventListener("message", ReceiveMessage, false);
            }
            else {
                //alert("not standards-compliant (ie8)");
                window.attachEvent("onmessage", ReceiveMessage);
            }
        }
    </script>


</head>
<body>

    <iframe id="ifrmChild" src="child.htm" frameborder="0" width="500" height="200" ></iframe>
    <br />


    <input type="button" value="Test" onclick="SendMessage();" />

</body>
</html>

Child.htm

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title></title>

    <!--
    <link rel="shortcut icon" href="/favicon.ico">


    <link rel="start" href="http://benalman.com/" title="Home">

    <link rel="stylesheet" type="text/css" href="/code/php/multi_file.php?m=benalman_css">

    <script type="text/javascript" src="/js/mt.js"></script>
    -->

    <script type="text/javascript">
        /*
        // Opera 9 supports document.postMessage() 
        // document is wrong
        window.addEventListener("message", function (e) {
            //document.getElementById("test").textContent = ;
            alert(
                e.domain + " said: " + e.data
                );
        }, false);
        */

        // https://developer.mozilla.org/en-US/docs/Web/API/window.postMessage
        // http://ejohn.org/blog/cross-window-messaging/
        // http://benalman.com/projects/jquery-postmessage-plugin/
        // http://benalman.com/code/projects/jquery-postmessage/docs/files/jquery-ba-postmessage-js.html

        // .data – A string holding the message passed from the other window.
        // .domain (origin?) – The domain name of the window that sent the message.
        // .uri – The full URI for the window that sent the message.
        // .source – A reference to the window object of the window that sent the message.
        function ReceiveMessage(evt) {
            var message;
            //if (evt.origin !== "http://robertnyman.com")
            if(false)
            {
                message = 'You ("' + evt.origin + '") are not worthy';
            }
            else
            {
                message = 'I got "' + evt.data + '" from "' + evt.origin + '"';
            }

            //alert(evt.source.location.href)

            var ta = document.getElementById("taRecvMessage");
            if(ta == null)
                alert(message);
            else
                document.getElementById("taRecvMessage").innerHTML = message;

            // http://javascript.info/tutorial/cross-window-messaging-with-postmessage
            //evt.source.postMessage("thanks, got it", evt.origin);
            evt.source.postMessage("thanks, got it", "*");
        } // End Function ReceiveMessage




        if (!window['postMessage'])
            alert("oh crap");
        else {
            if (window.addEventListener) {
                //alert("standards-compliant");
                // For standards-compliant web browsers (ie9+)
                window.addEventListener("message", ReceiveMessage, false);
            }
            else {
                //alert("not standards-compliant (ie8)");
                window.attachEvent("onmessage", ReceiveMessage);
            }
        }
    </script>


</head>
<body style="background-color: gray;">
    <h1>Test</h1>

    <textarea id="taRecvMessage" rows="20" cols="20" ></textarea>

</body>
</html>

Ответ 4

У вас есть несколько вариантов:

  • Скрыть область вниз (см. документ.домен) как на странице содержания, так и на iframe на то же самое. Тогда они не будут связаны ограничениями "того же происхождения".

  • Используйте postMessage, который поддерживается всеми браузерами HTML5 для связи cross-domain.

Ответ 5

Хорошая статья здесь: Междоменная связь с iframes

Также вы можете напрямую установить document.domain в оба кадра (даже

document.domain = document.domain;

имеет смысл, потому что сбрасывает порт в null), но этот трюк не является универсальным.

Ответ 6

попробовать

window.frameElement.ownerDocument.domain