Ta sama polityka pochodzenia
Chciałem stworzyć wiki społeczności dotyczące zasad HTML / JS tego samego pochodzenia, aby pomóc każdemu, kto szuka tego tematu. Jest to jeden z najczęściej wyszukiwanych tematów w SO i nie ma dla niego skonsolidowanej wiki, więc zaczynam :)
Ta sama zasada pochodzenia zapobiega pobieraniu lub ustawianiu właściwości dokumentu z innego źródła przez dokument lub skrypt załadowany z jednego źródła. Ta polityka sięga aż do Netscape Navigator 2.0.
Jakie są Twoje ulubione sposoby obchodzenia zasad dotyczących tego samego pochodzenia?
Prosimy o rozwiązywanie przykładów, a najlepiej także łączenie źródeł.
javascript
ajax
same-origin-policy
David Titarenco
źródło
źródło
not constructive
tag wydaje się kompletnie bezsensowny. Zagłosowano na ponowne otwarcie.Odpowiedzi:
document.domain
metodaZauważ, że jest to metoda iframe, która ustawia wartość document.domain na przyrostek bieżącej domeny. Jeśli tak się stanie, krótsza domena jest używana do kolejnych kontroli pochodzenia. Na przykład załóżmy, że skrypt w dokumencie
http://store.company.com/dir/other.html
wykonuje następującą instrukcję:Po wykonaniu tej instrukcji strona przeszłaby sprawdzenie pochodzenia
http://company.com/dir/page.html
. Jednak tego samego rozumowania, company.com nie może ustawićdocument.domain
sięothercompany.com
.Dzięki tej metodzie możliwe byłoby wykonanie javascript z elementu iframe pochodzącego z subdomeny na stronie pochodzącej z domeny głównej. Ta metoda nie jest odpowiednia dla zasobów międzydomenowych, ponieważ przeglądarki takie jak Firefox nie pozwalają na zmianę
document.domain
domeny na całkowicie obcą.Źródło: https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript
Metoda udostępniania zasobów między źródłami
Współdzielenie zasobów między źródłami (CORS) to robocza wersja robocza W3C, która definiuje sposób komunikacji przeglądarki i serwera podczas uzyskiwania dostępu do źródeł z różnych źródeł. Podstawową ideą CORS jest użycie niestandardowych nagłówków HTTP, aby umożliwić zarówno przeglądarce, jak i serwerowi wzajemne poznanie się, aby określić, czy żądanie lub odpowiedź powinny się powieść, czy nie.
W przypadku prostego żądania, które używa niestandardowych nagłówków
GET
lubPOST
bez nich i którego treść jesttext/plain
, żądanie jest wysyłane z dodatkowym nagłówkiem o nazwieOrigin
. Nagłówek Origin zawiera pochodzenie (protokół, nazwę domeny i port) strony żądającej, dzięki czemu serwer może łatwo określić, czy powinien dostarczyć odpowiedź. PrzykładowyOrigin
nagłówek może wyglądać następująco:Jeśli serwer zdecyduje, że żądanie powinno być dozwolone, wysyła
Access-Control-Allow-Origin
nagłówek powracający do tego samego źródła, które zostało wysłane, lub*
jeśli jest to zasób publiczny. Na przykład:Jeśli brakuje tego nagłówka lub źródła nie są zgodne, przeglądarka odrzuca żądanie. Jeśli wszystko jest w porządku, przeglądarka przetwarza żądanie. Należy pamiętać, że ani żądania, ani odpowiedzi nie zawierają informacji o plikach cookie.
Zespół Mozilli sugeruje w swoim poście na temat CORS , aby sprawdzić istnienie
withCredentials
właściwości, aby określić, czy przeglądarka obsługuje CORS przez XHR. Następnie możesz powiązać istnienieXDomainRequest
obiektu, aby objąć wszystkie przeglądarki:Zwróć uwagę, że aby metoda CORS działała, musisz mieć dostęp do dowolnego typu mechaniki nagłówka serwera i nie możesz po prostu uzyskać dostępu do zasobów stron trzecich.
Źródło: http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/
window.postMessage
metodawindow.postMessage
, po wywołaniu, powoduje wywołanie aMessageEvent
w oknie docelowym, gdy jakikolwiek oczekujący skrypt, który musi zostać wykonany, zakończy się (np. pozostałe programy obsługi zdarzeń, jeśliwindow.postMessage
jest wywoływane z modułu obsługi zdarzeń, wcześniej ustawione oczekujące limity czasu itp.).MessageEvent
Ma wiadomość typu,data
nieruchomości, który jest ustawiony na wartość ciągu pierwszego argumentu dostarczonychwindow.postMessage
Anorigin
nieruchomość odpowiadającą pochodzenia głównego dokumentu w oknie wywołującegowindow.postMessage
w momenciewindow.postMessage
nazwano orazsource
mienia, które jest okno z którywindow.postMessage
jest nazywany.Aby użyć
window.postMessage
, należy dołączyć detektor zdarzeń:A
receiveMessage
funkcja musi zostać uznana:Element iframe poza witryną musi również prawidłowo wysyłać zdarzenia za pośrednictwem
postMessage
:Każde okno może uzyskać dostęp do tej metody w dowolnym innym oknie, w dowolnym momencie, niezależnie od lokalizacji dokumentu w oknie, aby wysłać do niego wiadomość. W związku z tym każdy detektor zdarzeń używany do odbierania wiadomości musi najpierw sprawdzić tożsamość nadawcy wiadomości, używając pochodzenia i prawdopodobnie właściwości źródła. Nie można tego bagatelizować: brak sprawdzenia
origin
i prawdopodobniesource
właściwości umożliwia ataki typu cross-site scripting.Źródło: https://developer.mozilla.org/en/DOM/window.postMessage
źródło
Access-Control-Allow-Origin: http://www.stackoverflow.com/
zamiast:Access-Control-Allow-Origin: http://www.stackoverflow.com
(ukośnik na końcu adresu URL), nie działa w Safari i FF, ale działa w Chrome. Oczywiście bez ukośnika działa dobrze we wszystkich przeglądarkach.postMessage
metoda działa tylko w przeglądarkach, które ją obsługują, ponieważ jest to dodatek HTML5. Ta wtyczka próbuje to uwzględnić. Wspominam o tym, bo uczę się tego na własnej skórze.Metoda odwrotnego proxy
Skonfigurowanie prostego odwrotnego proxy na serwerze pozwoli przeglądarce na użycie ścieżek względnych dla żądań Ajax, podczas gdy serwer będzie działał jako proxy do dowolnej lokalizacji zdalnej.
Jeśli używasz mod_proxy w Apache, podstawową dyrektywą konfiguracyjną do skonfigurowania zwrotnego proxy jest
ProxyPass
. Zwykle jest używany w następujący sposób:W takim przypadku przeglądarka mogłaby zażądać
/ajax/web_service.xml
jako względnego adresu URL, ale serwer mógłby to obsłużyć, działając jako serwer proxyhttp://other-domain.com/ajax/web_service.xml
.Jedną z interesujących cech tej metody jest to, że zwrotny serwer proxy może z łatwością dystrybuować żądania do wielu zaplecza, działając w ten sposób jako moduł równoważenia obciążenia .
źródło
Używam JSONP.
Zasadniczo dodajesz
na Twojej stronie.
Powinna zostać wywołana some_func (), aby otrzymać powiadomienie, że dane są w środku.
źródło
AnyOrigin nie działał dobrze z niektórymi witrynami https, więc właśnie napisałem alternatywę o otwartym kodzie źródłowym o nazwie whatorigin.org, która wydaje się dobrze działać z https.
Kod na github .
źródło
Najnowszym sposobem na obejście zasad tego samego pochodzenia, które znalazłem, jest http://anyorigin.com/
Witryna została stworzona tak, że po prostu podajesz jej dowolny adres URL i generuje dla Ciebie kod javascript / jquery, który umożliwia pobranie html / data, niezależnie od ich pochodzenia. Innymi słowy, sprawia, że dowolny adres URL lub strona internetowa jest żądaniem JSONP.
Uważam, że to całkiem przydatne :)
Oto przykładowy kod javascript z anyorigin:
źródło
Nie mogę przypisać sobie zasługi dla tego obrazu, ale pasuje do wszystkiego, co wiem na ten temat, a jednocześnie oferuje odrobinę humoru.
http://www.flickr.com/photos/iluvrhinestones/5889370258/
źródło
Na myśl przychodzi JSONP :
źródło
Osobiście
window.postMessage
jest to najbardziej niezawodny sposób, jaki znalazłem dla nowoczesnych przeglądarek. Musisz trochę więcej pracy, aby upewnić się, że nie jesteś narażony na ataki XSS, ale jest to rozsądny kompromis.Istnieje również kilka wtyczek do popularnych zestawów narzędzi Javascript,
window.postMessage
które zapewniają podobną funkcjonalność do starszych przeglądarek, wykorzystując inne metody omówione powyżej.źródło
Cóż, użyłem curl w PHP, aby to obejść. Mam usługę sieciową działającą na porcie 82.
Oto javascript, który wywołuje plik PHP
Mój HTML działa na WAMP w porcie 80. No więc, tak, ta sama polityka pochodzenia została ominięta :-)
źródło
Oto kilka obejść i wyjaśnienie zasad tego samego pochodzenia:
Blog Thiru - obejście zasad dotyczących tego samego pochodzenia w przeglądarce
źródło
Ta analiza prawie tego, co jest tam dostępne: http://www.slideshare.net/SlexAxton/breaking-the-cross-domain-barrier
W przypadku rozwiązania postMessage spójrz na:
https://github.com/chrissrogers/jquery-postmessage/blob/master/jquery.ba-postmessage.js
i nieco inna wersja:
https://github.com/thomassturm/ender-postmessage/blob/master/ender-postmessage.js
źródło