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.

Author: David Titarenco, 2010-06-19

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ści withCredentials, 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

 84
Author: David Titarenco,
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
Na serwerze można skonfigurować proste odwrotne proxy, dzięki czemu przeglądarka będzie używać ścieżek względnych dla żądań Ajax, podczas gdy serwer będzie działał jako proxy dla dowolnej zdalnej lokalizacji.

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.

 41
Author: Daniel Vassallo,
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.

 17
Author: Nicolas Viennot,
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.

Kod na github .

 13
Author: ripper234,
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);
});
 12
Author: rk1s,
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.

Http://www.flickr.com/photos/iluvrhinestones/5889370258/

 12
Author: Mat Schaffer,
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.

 3
Author: Sarfraz,
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.

 1
Author: Justin Niessner,
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: -)

 1
Author: harihb,
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

 1
Author: user1094140,
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
 1
Author: Chris Cinelli,
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