document.domain
metoda
Zauważ, ż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ę:
document.domain = "company.com";
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
lub POST
bez nich i którego treść jest text/plain
, żądanie jest wysyłane z dodatkowym nagłówkiem o nazwie Origin
. 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ładowy Origin
nagłówek może wyglądać następująco:
Origin: http://www.stackoverflow.com
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:
Access-Control-Allow-Origin: http://www.stackoverflow.com
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ć istnienie XDomainRequest
obiektu, aby objąć wszystkie przeglądarki:
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();
}
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
metoda
window.postMessage
, po wywołaniu, powoduje wywołanie a MessageEvent
w oknie docelowym, gdy jakikolwiek oczekujący skrypt, który musi zostać wykonany, zakończy się (np. pozostałe programy obsługi zdarzeń, jeśli window.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 dostarczonych window.postMessage
An origin
nieruchomość odpowiadającą pochodzenia głównego dokumentu w oknie wywołującego window.postMessage
w momencie window.postMessage
nazwano oraz source
mienia, które jest okno z który window.postMessage
jest nazywany.
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);
A receiveMessage
funkcja musi zostać uznana:
function receiveMessage(event)
{
// do something with event.data;
}
Element iframe poza witryną musi również prawidłowo wysyłać zdarzenia za pośrednictwem 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ć 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 prawdopodobnie source
właściwości umożliwia ataki typu cross-site scripting.
Źródło: https://developer.mozilla.org/en/DOM/window.postMessage