Обойти ту же политику происхождения в JavaScript без серверных сценариев - PullRequest
10 голосов
/ 14 января 2010

У меня есть среда, которая на самом деле не позволяет создавать сценарии на стороне сервера (очень трудно установить сценарий на сервере). Я пытался использовать iframe, чтобы нарушить то же происхождение javascript; Однако это не сработало. Есть ли другие обходные пути, о которых я не знаю?

Спасибо!

Ответы [ 2 ]

28 голосов
/ 14 января 2010

Как упомянул Дэвид Дорвард , JSON-P - самый простой и быстрый; Тем не менее, есть еще одна хитрость, в частности, использование двух iframe.

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

На двух доменах / сайтах три страницы.

  1. Родительская страница
  2. Страница содержания
  3. Страница междоменной связи (он же "xdcomm")

Страницы родительской страницы и страницы xdcomm размещены в одном домене, страница содержимого - в любом другом домене. Страница содержимого встраивается в качестве iframe в родительскую страницу, а страница xdcomm встраивается в качестве скрытого iframe в страницу содержимого.

enter image description here

Страница xdcomm содержит очень простой сценарий, который определяет параметры GET в строке запроса, анализирует эту строку для переменных method и args (где args - строка в кодировке JSON), а затем выполняет указанный метод с указанными аргументами на родительской странице. Примером может быть здесь (просмотреть исходный код).

Несмотря на то, что политика одинакового происхождения JavaScript ограничивает доступ кода одного домена к домену другого, не имеет значения, вложены ли домены друг в друга (домен A, вложен в домен B, вложен в домен A).

Итак, вкратце, страница содержимого отправляет сообщения на родительскую страницу через страницу xdcomm, изменяя источник iframe на что-то вроде http://domaina.com/xdcomm.html?src=foo&args=[1,2,3,4]. Это было бы эквивалентно выполнению foo(1,2,3,4) на родительской странице.

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

2 голосов
/ 14 января 2010

Надеюсь, нет, так как это будет дыра в безопасности! :)

Но если оба ваших сайта являются поддоменами в одном домене, возможно, document.domain может помочь.

...