Междоменный запрос Ajax из файла js - PullRequest
10 голосов
/ 26 ноября 2008

Вот проблема:

1.) У нас есть страница здесь ... www.blah.com/mypage.html

2.) Эта страница запрашивает файл js www.foo.com, например ...

<script type="text/javascript" src="http://www.foo.com/jsfile.js" />

3.) "Jsfile.js" использует Prototype для отправки запроса Ajax на www.foo.com.

4.) Запрос ajax вызывает www.foo.com/blah.html. Функция обратного вызова получает ответ html и выбрасывает его в div.

Это, похоже, не работает, я думаю, это XSS. Это правильно?

Если так, как я могу решить эту проблему? Есть ли другой способ получить мой html с www.foo.com на www.blah.com на клиенте без использования iframe?

Ответы [ 7 ]

14 голосов
/ 26 ноября 2008

Это XSS и это запрещено. Вы действительно не должны так поступать.

Если вам действительно нужно, заставьте свой AJAX-код вызывать локальный код (PHP, ASP и т. Д.) На blah.com и заставить его вести себя как клиент, получать все, что вам нужно от foo.com и возвращать его обратно клиенту , Если вы используете PHP, вы можете сделать это с помощью fopen ('www.foo.com/blah.html', 'r') и затем читать содержимое, как если бы это был обычный файл.

Конечно, allow_remote_url_fopen (или как он там точно называется) должен быть включен в вашем php.ini.

6 голосов
/ 26 ноября 2008

Существует предложение w3c , позволяющее сайтам указывать другие сайты, которым разрешено делать к ним межсайтовые запросы. (Википедия, возможно, захочет разрешить все запросы на статьи, скажем, но почта Google не захочет разрешать запросы - так как это может позволить открыть любой веб-сайт, когда вы вошли в почту Google для чтения почты).

Это может быть доступно в какой-то момент в будущем.

3 голосов
/ 22 ноября 2012

Как уже упоминалось выше, JSONP - способ обойти это. Однако сайт, для которого вы запрашиваете данные, должен поддерживать JSONP, чтобы вы могли использовать его на клиенте. (JSONP, по сути, внедряет тег script в страницу и предоставляет функцию обратного вызова, которая должна вызываться с результатами)

Если сайт, на который вы делаете запрос, не поддерживает JSONP, вам придется прокси-запрос на вашем сервере. Как уже упоминалось выше, вы можете сделать это на своем собственном сервере, или в прошлом я использовал http://www.jsonpit.com,, который проксирует запрос для вас.

2 голосов
/ 26 ноября 2008

Одним из вариантов является реализация прокси-страницы, которая принимает в качестве параметра нужный URL-адрес. например http://blah.com/proxy?uri=http://foo.com/actualRequest

1 голос
/ 03 мая 2009

JSONP был частично разработан для решения вашей проблемы

http://ajaxian.com/archives/jsonp-json-with-padding

JQuery использует метод $ .getJSON

http://docs.jquery.com/Ajax/jQuery.getJSON

0 голосов
/ 03 мая 2009

Для междоменных обращений это хороший рабочий пример, и теперь он рассматривается как «стандартный» http://www.xml.com/pub/a/2005/12/21/json-dynamic-script-tag.html.

есть и другие способы, например, для внедрения iframes с измененным document.domain

http://fettig.net/weblog/2005/11/28/how-to-make-xmlhttprequest-connections-to-another-server-in-your-domain/

Я до сих пор согласен, что самый простой способ - вызвать прокси в том же домене, но тогда это не совсем клиентский вызов WS.

0 голосов
/ 26 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...