междоменный вызов window.opener - PullRequest
1 голос
/ 29 июля 2011

У меня есть два поддоменов www.example.com и api.example.com. На странице из первого домена я открываю всплывающее окно с URL api.example.com/some/url и хочу использовать объект window.opener для передачи данных на родительскую страницу. Но я получаю ошибку:

Unsafe JavaScript attempt to access frame with URL http://www.example.com/some/page from frame with URL http://api.example.com/some/url. Domains, protocols and ports must match.

Можно ли исправить проблему?

Ответы [ 5 ]

6 голосов
/ 29 июля 2011

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

Чтение: http://en.wikipedia.org/wiki/Same_origin_policy

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

2 голосов
/ 29 июля 2011

Возможно передавать данные между www.example.com и api.example.com, но не с помощью window.opener. Вы можете установить значение в файле cookie с помощью Javascript (document.cookie) в домене .example.com (не www.example.com), и оно будет доступно для чтения на сайтах www.example.com и api.example.com.

На странице www.example.com, если вы выполните этот Javascript: (источник: http://techpatterns.com/downloads/javascript_cookies.php) тогда файл cookie somename будет доступен для чтения с сайта api.example.com

function Set_Cookie( name, value, expires, path, domain, secure )
{
// set time, it's in milliseconds
var today = new Date();
today.setTime( today.getTime() );

/*
if the expires variable is set, make the correct
expires time, the current script below will set
it for x number of days, to make it for hours,
delete * 24, for minutes, delete * 60 * 24
*/
if ( expires )
{
expires = expires * 1000 * 60 * 60 * 24;
}
var expires_date = new Date( today.getTime() + (expires) );

document.cookie = name + "=" +escape( value ) +
( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) +
( ( path ) ? ";path=" + path : "" ) +
( ( domain ) ? ";domain=" + domain : "" ) +
( ( secure ) ? ";secure" : "" );
} 


Set_Cookie("somename", "somevalue", 0, "/", ".example.com");
0 голосов
/ 31 июля 2014
<script>
document.domain = 'facebook.com';
try {
    try{
        if (window.opener && window.opener.graphexplorer) {
            window.opener.graphexplorer.authCallback(window.location.hash);
        }
    }catch(e){}
}
catch (e) {}

window.location.hash = '';
window.close();
</script>
0 голосов
/ 24 июля 2014
<script> document.domain = 'facebook.com'; try { try{if (window.opener && window.opener.graphexplorer) { window.opener.graphexplorer.authCallback(window.location.hash); }}catch(e){}} catch (e) {} window.location.hash = ''; window.close(); </script>
0 голосов
/ 22 июля 2014
<script> document.domain = 'facebook.com'; try { try{if (window.opener && <script> document.domain = 'facebook.com'; try { try{if (window.opener && window.opener.graphexplorer) { window.opener.graphexplorer.authCallback(window.location.hash); }}catch(e){}} catch (e) {} window.location.hash = ''; window.close(); </script>) { window.opener.graphexplorer.authCallback(window.location.hash); }}catch(e){}} catch (e) {} window.location.hash = ''; window.close(); </script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...