Небезопасная попытка JavaScript получить доступ к фрейму с URL-адресом

112

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

Небезопасная попытка JavaScript получить доступ к фрейму с URL "URL1" из фрейма с URL "URL2". Домены, протоколы и порты должны совпадать.

Как я могу исправить эту проблему?

Атула
источник
3
Пожалуйста, добавьте более подробную информацию, фрагменты кода, сообщение об ошибке, структуру, которую вы используете ... Более подробное
описание
5
А как насчет того, чтобы реализовать социальные плагины g + 1, facebook like или shre и twitter, которые загружаются в окна iframe и выдают ту же ошибку?
Вопрос в том, ПОЧЕМУ скрипты Facebook и Google даже ПЫТАЮТСЯ получить доступ к элементам моего сайта.
sergio

Ответы:

124

Из дочернего документа другого происхождения вам не разрешен доступ к location.hashсвойству верхнего окна , но вы можете установить само locationсвойство.

Это означает, что, учитывая расположение верхнего окна http://example.com/page/, вместо выполнения

parent.location.hash = "#foobar";

вам нужно знать местонахождение родителей и сделать

parent.location = "http://example.com/page/#foobar";

Поскольку ресурс не перемещается, это будет работать, как ожидалось, с изменением только хэш-части URL-адреса.

Если вы используете это для междоменного взаимодействия, я бы рекомендовал вместо этого использовать easyXDM .

Шон Кинси
источник
13
Никто не отметил это как ответ, но он получил 60 голосов. Для этого должен быть значок.
zachzurn
35
Как будет называться значок? «
Отвечает
1
Привет, @atul, будь добрым и отметь этот ответ как лучший. Относитесь с уважением к условностям, которые позволяют всем нам извлекать пользу из знаний других ...
Клинт Иствуд
13

Кроссфрейм-скриптинг невозможен, если два фрейма имеют разные домены -> Безопасность.

Смотрите это: http://javascript.about.com/od/reference/a/frame3.htm

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

EvilMM
источник
82
Это частое требование, когда на ваш веб-сайт встраивается стороннее приложение, особенно если веб-сервисы и т.п. не подходят.
Жак
9

Я получал такое же сообщение об ошибке, когда пытался изменить домен для iframe.src.

Для меня ответ заключался в том, чтобы изменить iframe.src на URL-адрес в ТАКОМ домене, но на самом деле это была страница с перенаправлением html на желаемый домен. Затем другой домен появился в моем iframe без каких-либо ошибок.

Работал как шарм. :)

Томми
источник
не могли бы вы подробнее рассказать о том, чем именно вы здесь занимались?
Девин Дж. Род,
было бы действительно полезно, если бы вы могли кратко объяснить.
Мадхусудхан
2
Не работает в последней версии Chrome: он не проверяет параметр src, а загружает фактический URL. Так что трюк с перенаправлением, к сожалению, никоим образом не помогает :-(
lucaferrario
3
Я считаю, что Томми имеет в виду прокси на стороне сервера. См., Например, benalman.com/projects/php-simple-proxy или developer.yahoo.com/javascript/howto-proxy.html или google.com/… или решение Рене де Ката на stackoverflow.com/a/11224975/27938
Оскар Austegard
Это здорово. Но это просто показывает, насколько тривиально это обойти. Хорошо, давайте предположим, что я злой злонамеренный хакер и хочу проводить атаки с использованием междоменных сценариев. Скорее всего, я узнаю об этих инструментах и ​​воспользуюсь ими. Что касается исправлений безопасности браузера, это легко так же замедляется, как IE не позволяет вам запускать Javascript локально без предупреждения. Не решает проблем. Создает кучу новых.
Ицхак
6

Решением может быть использование локального файла, который извлекает удаленный контент.

remoteInclude.php

<?php
$url = $_GET['url'];
$contents = file_get_contents($url);
echo $contents;

HTML

<iframe frameborder="1" id="frametest" src="/remoteInclude.php?url=REMOTE_URL_HERE"></iframe>
<script>
    $("#frametest").load(function (){       
    var contents =$("#frametest").contents();
});


источник
1
Это открывает двери для уязвимостей межсайтового скриптинга. Пример возможной атаки: 1. Я создаю страницу на myevilserver.com, которая выглядит точно так же, как ваш сайт, включая форму входа, которая отправляет POST обратно на myevilserver.com 2. Я отправляю вашим пользователям поддельный информационный бюллетень со ссылкой на https: // yoursite.com/remoteInclude.php?url=myevilserver.com 3. Они видят на вашем сайте форму входа, которую я записал на своем сервере.
EricP
2
Возможное решение - заставить remoteInclude.php проверять все URL-адреса на предварительно утвержденный список доменов.
EricP
Это не решает проблемы уязвимости межсайтового скриптинга. Нет абсолютно ничего, что я могу сделать с Javascript для внешнего веб-сайта, чего я не могу сделать на стороне сервера. Все это мешает самому браузеру и делает веб-приложения менее полезными, вводя дополнительный шаг. Вы все еще можете делать все это, если загружаете через ajax, переписываете ссылки и отправляете обратно. Если это не сработает, удалите его через php или любой другой язык. Абсурдно, что это проблема даже среднего программиста.
Ицхак
3

Я обнаружил, что использование XFBML-версии кнопки «Нравится» Facebook вместо версии HTML5 решило эту проблему. Добавьте приведенный ниже код туда, где должна отображаться кнопка:

<div id="fb-root"></div>
<script>(function (d, s, id) {
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return;
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.net/en_GB/all.js#xfbml=1";
    fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>

<fb:like send="true" layout="button_count" width="50" show_faces="false" font="arial"></fb:like>

Затем добавьте это в свой HTML-тег:

 xmlns:fb="http://ogp.me/ns/fb#"
Люк Олдертон
источник
2
Какое отношение имеет Facebook к этому вопросу?
Kukks
16
Потому что вы также получаете эту ошибку на кнопках facebook, и я нашел эту страницу при поиске ответа, поэтому подумал, что другим может понадобиться ответ.
Люк Олдертон
1

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

user2345833
источник