Sposoby obchodzenia Polityki tego samego pochodzenia
The same origin policy
Chciałem stworzyć wiki społeczności dotyczące HTML / JS Zasady tego samego pochodzenia , aby mieć nadzieję pomóc każdemu, kto szuka tego tematu. Jest to jeden z najczęściej poszukiwanych tematów NA SO I nie ma na to skonsolidowanej wiki więc zapraszam:)
Ta sama polityka pochodzenia zapobiega dokument lub skrypt załadowany z jednego pochodzenie od uzyskania lub ustawienia Właściwości dokumentu z innego pochodzenie. Ta polityka datuje się na całą drogę powrót do Netscape Navigator 2.0.
Jakie są Twoje ulubione sposoby na obejście zasad tego samego pochodzenia?
Proszę zachować szczegółowe przykłady i najlepiej również połączyć swoje źródła.
11 answers
Metoda document.domain
- Typ metody: iframe .
Zauważ, że jest to metoda iframe, która ustawia wartość dokumentu.domeny do przyrostka 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 w http://store.company.com/dir/other.html
wykonuje następującą instrukcję:
document.domain = "company.com";
Po wykonaniu tego polecenia, strona przejdzie sprawdzenie pochodzenia za pomocą http://company.com/dir/page.html
. Jednak przez to samo rozumowanie, company.com nie można ustawić document.domain
na othercompany.com
.
Dzięki tej metodzie możesz wykonywać javascript z ramki iframe pochodzącej z subdomeny na stronie pochodzącej z domeny głównej. Ta metoda nie jest odpowiednia dla zasobów między domenami, ponieważ przeglądarki takie jak Firefox nie pozwolą Ci zmienić document.domain
na całkowicie obcą domenę.
Źródło: https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript
Dzielenie Zasobów Między Źródłami metoda
- Typ metody: AJAX .
Cross-Origin Resource Sharing (CORS) jest roboczym szkicem W3C, który określa, jak przeglądarka i serwer muszą się komunikować podczas uzyskiwania dostępu do źródeł w różnych źródłach. Podstawową ideą CORS jest użycie niestandardowych nagłówków HTTP, aby zarówno przeglądarka, jak i serwer wiedzieli wystarczająco dużo o sobie nawzajem, aby określić, czy żądanie lub odpowiedź powinna odnieść sukces lub zawieść.
Dla prostego żądania, które wykorzystuje albo GET
lub POST
BEZ niestandardowych nagłówków i którego ciałem jest text/plain
, żądanie jest wysyłane z dodatkowym nagłówkiem o nazwie Origin
. Nagłówek Origin Zawiera źródło pochodzenia (protokół, nazwę domeny i port) strony żądającej, dzięki czemu serwer może łatwo określić, czy ma służyć odpowiedzi. PrzykładOrigin
nagłówek może wyglądać tak:
Origin: http://www.stackoverflow.com
Jeśli serwer zdecyduje, że żądanie powinno być dozwolone, wysyła Access-Control-Allow-Origin
nagłówek przypominający to samo pochodzenie, które zostało wysłane lub Jeśli to źródło publiczne. Na przykład:
Access-Control-Allow-Origin: http://www.stackoverflow.com
Jeśli brakuje tego nagłówka lub źródła nie pasują, przeglądarka wyłącza żądanie. Jeśli wszystko jest dobrze, przeglądarka przetwarza żądanie. Należy pamiętać, że żądania ani odpowiedzi nie zawierają informacji o plikach cookie.
Zespół Mozilli sugeruje w swoim poście o CORS , aby sprawdzić istnienie właściwościwithCredentials
, aby określić, czy przeglądarka obsługuje CORS przez XHR. Możesz wtedy połączenie z istnieniem obiektu XDomainRequest
w celu pokrycia wszystkich przeglądarek:
function createCORSRequest(method, url){
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr){
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined"){
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
xhr = null;
}
return xhr;
}
var request = createCORSRequest("get", "http://www.stackoverflow.com/");
if (request){
request.onload = function() {
// ...
};
request.onreadystatechange = handler;
request.send();
}
Zauważ, ż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 innych firm.
Źródło: http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/
Metoda window.postMessage
- Typ metody: iframe .
window.postMessage
, po wywołaniu, powoduje wysłanie MessageEvent
do okna docelowego, gdy wszystkie oczekujące skrypty, które muszą zostać wykonane (np. pozostałe procedury obsługi zdarzeń, jeśli window.postMessage
jest wywołane z procedury obsługi zdarzeń, wcześniej ustawione oczekujące timeouty, itd.). MessageEvent
mA typ message, właściwość data
, która jest ustawiona na wartość łańcuchową pierwszego argumentu dostarczonego do window.postMessage
, właściwość origin
odpowiadającą początkowi głównego dokumentu w wywołaniu okna window.postMessage
w momencie wywołania window.postMessage
, oraz właściwość source
właściwość, która jest oknem, z którego wywołane jest window.postMessage
.
Aby użyć window.postMessage
, należy dołączyć detektor zdarzeń:
// Internet Explorer
window.attachEvent('onmessage',receiveMessage);
// Opera/Mozilla/Webkit
window.addEventListener("message", receiveMessage, false);
I receiveMessage
należy zadeklarować funkcję:
function receiveMessage(event)
{
// do something with event.data;
}
Off-site iframe musi również poprawnie wysyłać zdarzenia poprzez postMessage
:
<script>window.parent.postMessage('foo','*')</script>
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ć mu wiadomość. W związku z tym każdy odbiorca zdarzeń używany do odbierania wiadomości musi najpierw sprawdź tożsamość nadawcy wiadomości, używając właściwości origin i ewentualnie source. Nie można tego zaniżyć: brak sprawdzenia właściwości origin
i ewentualnie source
umożliwia ataki Skryptowe.
Źródło: https://developer.mozilla.org/en/DOM/window.postMessage
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-06 21:12:14
Metoda odwrotnego Proxy
- Typ metody: Ajax
Jeśli używasz mod_proxy W Apache, podstawową dyrektywą konfiguracyjną do skonfigurowania odwrotnego serwera proxy jest ProxyPass
. Zazwyczaj używa się go w następujący sposób:
ProxyPass /ajax/ http://other-domain.com/ajax/
W w tym przypadku przeglądarka mogłaby zażądać /ajax/web_service.xml
jako względnego adresu URL, ale serwer obsługiwałby to, działając jako proxy do http://other-domain.com/ajax/web_service.xml
.
Jedną z ciekawych cech tej metody jest to, że odwrotne proxy mogą łatwo dystrybuować żądania do wielu back-endów, działając w ten sposób jako load balancer.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-20 04:12:41
Używam JSONP.
W zasadzie dodajesz
<script src="http://..../someData.js?callback=some_func"/>
Na twojej stronie.
Some_func () powinno zostać wywołane tak, że zostaniesz powiadomiony o tym, że dane są w.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-19 17:09:09
AnyOrigin nie działał dobrze z niektórymi witrynami https, więc napisałem alternatywę open source o nazwie whateverorigin.org to wydaje się działać dobrze z https.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-27 00:45:00
Najnowszym sposobem przezwyciężenia Polityki tego samego pochodzenia, który znalazłem, jest http://anyorigin.com/
Strona jest tak, że po prostu dać mu dowolny adres url i generuje kod javascript / jquery dla Ciebie, który pozwala uzyskać html / dane, niezależnie od jego pochodzenia. Innymi słowy, sprawia, że dowolny adres url lub strona internetowa jest żądaniem JSONP.
Uznałem to za bardzo przydatne:)
Oto przykładowy kod javascript z anyorigin:
$.getJSON('http://anyorigin.com/get?url=google.com&callback=?', function(data){
$('#output').html(data.contents);
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-24 00:13:50
Nie mogę się pochwalić tym obrazem, ale pasuje do wszystkiego, co wiem na ten temat i oferuje jednocześnie odrobinę humoru.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-14 02:50:31
Na myśl przychodzi JSONP:
JSONP lub "JSON with padding" to uzupełnienie podstawowych danych JSON format, wzorzec użycia, który pozwala na strona do zapytania i bardziej sensownie użyj JSON z serwera innego niż serwer główny. JSONP jest alternatywa dla nowszej metody nazywa się Cross-Origin Resource Sharing.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-19 19:07:37
Osobiście, {[0] } jest najbardziej niezawodny sposób, jaki znalazłem dla nowoczesnych przeglądarek. Musisz zrobić trochę więcej pracy, aby upewnić się, że nie zostawiasz siebie otwartym na ataki XSS, ale jest to rozsądny kompromis.
Istnieje również kilka wtyczek do popularnych zestawów narzędzi Javascript, które zawijają window.postMessage
, które zapewniają podobną funkcjonalność do starszych przeglądarek za pomocą innych metod omówionych powyżej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-19 17:06:01
Cóż, użyłem curl w PHP, aby to obejść. Mam webservice uruchomiony w porcie 82.
<?php
$curl = curl_init();
$timeout = 30;
$ret = "";
$url="http://localhost:82/put_val?val=".$_GET["val"];
curl_setopt ($curl, CURLOPT_URL, $url);
curl_setopt ($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($curl, CURLOPT_MAXREDIRS, 20);
curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5");
curl_setopt ($curl, CURLOPT_CONNECTTIMEOUT, $timeout);
$text = curl_exec($curl);
echo $text;
?>
Oto javascript, który wywołuje plik PHP
function getdata(obj1, obj2) {
var xmlhttp;
if (window.XMLHttpRequest)
xmlhttp=new XMLHttpRequest();
else
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","phpURLFile.php?eqp="+obj1+"&val="+obj2,true);
xmlhttp.send();
}
Mój HTML działa na WAMP w porcie 80. No i proszę, ta sama polityka pochodzenia została ominięta: -)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-12 09:05:50
Oto pewne obejścia i Wyjaśnienie Polityki tego samego pochodzenia:
Thiru ' s Blog-Browser same origin policy workaround
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-12 16:57:32
To analizuje prawie wszystko, co jest tam dostępne: http://www.slideshare.net/SlexAxton/breaking-the-cross-domain-barrier
Dla 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-19 23:56:22