Запрос Ajax для перекрестного домена из js файла

Здесь проблема:

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?

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 6

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

Ответ 7

Для перекрестных доменных ударов это хороший рабочий пример и теперь рассматривается как некоторый "стандартный" 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-клиент на стороне клиента.