2008-11-25 10 views
10

Oto problem:Krzyż domeny Ajax żądania od wewnątrz pliku js

1.) Mamy tu strona ... www.blah.com/mypage.html

2.) To strona żąda js złożyć www.foo.com tak ...

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

3.) "jsfile.js" używa Prototype dokonać żądania Ajax powrotem do www.foo.com.

4.) Żądanie ajax wywołuje www.foo.com/blah.html. Funkcja wywołania zwrotnego pobiera odpowiedź html i wyrzuca ją do elementu div.

Nie wydaje się to jednak działać, domyślam się, że to XSS. Czy to jest poprawne?

Jeśli tak, jak mogę rozwiązać ten problem? Czy istnieje inny sposób na uzyskanie mojego html ze strony www.foo.com na stronie www.blah.com na kliencie bez użycia elementu iframe?

+1

Istnieje naprawdę fajny artykuł dotyczący żądania domeny w domenie krzyżowej - http://tek-insight.blogspot.com/2010/05/cross-domain-ajax-request-proxy-json.html –

Odpowiedz

14

Jest to XSS i jest zabronione. Naprawdę nie powinieneś robić rzeczy w ten sposób.

Jeśli naprawdę potrzebujesz, spraw, aby twój kod AJAX dzwonił pod lokalny kod (PHP, ASP, cokolwiek) na blah.com i spraw, by zachowywał się jak klient i pobierał to, czego potrzebujesz od foo.com i zwracał je z powrotem do klient. Jeśli używasz PHP, możesz to zrobić za pomocą fopen ("www.foo.com/blah.html", "r"), a następnie czytając zawartość tak, jakby był zwykłym plikiem.

Oczywiście, allow_remote_url_fopen (lub jakkolwiek to się nazywa) musi być włączone w twoim php.ini.

2

Jedną z opcji jest zaimplementowanie strony proxy, która pobiera wymagany adres URL jako parametr. na przykład http://blah.com/proxy?uri=http://foo.com/actualRequest

+2

Lepiej rób trochę sprawdzania poprawności, aby upewnić się, że URL jest taki, jakiego oczekujesz ... w przeciwnym razie jest to poważna luka w zabezpieczeniach. – rmeador

+1

Oczywiście. Myślałem, że to sugeruje, kiedy powiedziałem "realizacji". – Rohit

0

Powyższa metoda może stać się dużą luką w zabezpieczeniach. Sugerujemy, aby zweryfikować nazwę witryny na białej liście i zbudować rzeczywisty identyfikator URI, który jest serwowany po stronie serwera.

6

Istnieje w3c proposal, aby umożliwić witrynom określenie innych witryn, które mogą przesyłać do nich zapytania przekierowujące. (Wikipedia może chcieć zezwolić na wszystkie żądania dotyczące artykułów, ale poczta google nie chce przyjmować żądań - ponieważ może to pozwolić na otwarcie dowolnej strony internetowej, gdy zalogujesz się do poczty google, aby przeczytać twoją pocztę).

Może to być dostępne w pewnym momencie w przyszłości.

+3

Obecna propozycja W3C nazywa się ["Udostępnianie zasobów krzyżowych"] (http://www.w3.org/TR/cors/), powszechnie znana jako ** 'CORS' **. – hippietrail

0

Dla trafień w domenach międzydomenowych jest to dobry przykład pracy i teraz jest uważany za coś, co "standard" http://www.xml.com/pub/a/2005/12/21/json-dynamic-script-tag.html.

istnieją inne sposoby, jak również, na przykład wstrzykiwanie iframe z document.domain zmienionych

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

Wciąż AGRE że łatwym sposobem jest wywołanie pełnomocnictwa w tej samej domenie, ale to nie jest naprawdę po stronie klienta Wywołanie WS.

3

Jak wspomniano powyżej jsonp jest sposób obejść. Witryna, z której żądasz danych, musi jednak obsługiwać JSONP, aby można było z niego korzystać na kliencie. (JSONP zasadniczo wstawia tag skryptu na stronę i zapewnia funkcję zwrotną, która powinna zostać wywołana z wynikami)

Jeśli witryna, do której wysyłasz prośbę, nie obsługuje JSONP, będziesz musiał złożyć wniosek serwer. Jak wspomniano powyżej, możesz to zrobić na swoim własnym serwerze lub w przeszłości, używaj numeru http://www.jsonpit.com, który będzie pełnić funkcję proxy dla Ciebie.