--- title: Reguła tego samego pochodzenia (Same-origin policy) slug: Web/Security/Same-origin_policy tags: - Bezpieczeństwo - CORS - Host - JavaScript - Same-origin policy - URL - origin - pochodzenie - reguła tego samego pochodzenia - źródło translation_of: Web/Security/Same-origin_policy original_slug: Web/Bezpieczeństwo/Same-origin_policy ---

Same-origin policy (reguła tego samego pochodzenia) to istotny mechanizm bezpieczeństwa, który określa sposób, w jaki dokument lub skrypt jednego pochodzenia ({{Glossary("origin")}}) może komunikować się z zasobem innego pochodzenia. Pozwala to na odizolowanie potencjalnie szkodliwych dokumentów i tym samym redukowane są czynniki sprzyjające atakom.

Definicja "origin"

Dwa URLe są tego samego pochodzenia, jeśli {{Glossary("protocol")}}, {{Glossary("port")}} (jeśli wyszczególniony) oraz {{Glossary("host")}} są takie same dla obu. Tego typu charakterystykę nazywa się "krotką schematu/hosta/portu" ("scheme/host/port tuple") lub po prostu "krotką" ("Krotka" to kolekcja elementów tworzących zbiór - generyczna forma, która może być podwójna/potrójna/poczwórna itd.).

Poniższa tabela zawiera przykłady zestawień "originów" z URLem http://store.company.com/dir/page.html:

URL Wynik Powód
http://store.company.com/dir2/other.html Same origin Różni się tylko ścieżka
http://store.company.com/dir/inner/another.html Same origin Różni się tylko ścieżka
https://store.company.com/page.html Niepowodzenie Inny protokół
http://store.company.com:81/dir/page.html Niepowodzenie Inny port (http:// domyślnie jest portem 80)
http://news.company.com/dir/page.html Niepowodzenie Inny host

Zobacz również definicję "origin" dla URLów file:, ich zestawienie jest bardziej złożone.

Odziedziczone "origin"

Skrypty wywoływane przez strony z URLami about:blank lub javascript: dziedziczą "origin" dokumentu zawierającego ten URL, ponieważ tego typu URLe nie zawierają informacji o serwerze źródłowym.

Przykładowo, about:blank jest często używany jako URL nowego, pustego, wyskakującego okienka, w którym skrypt-rodzic umieszcza treść (np. przez mechanizm {{domxref("Window.open()")}}). Jeśli dane okienko zawiera również JavaScript, skrypt odziedziczy ten sam "origin" jak skrypt, który je utworzył.

data: URLe zyskują nowy, pusty kontekst bezpieczeństwa.

Wyjątki w Internet Explorer

W Internecie Explorerze istnieją dwa wyjątki od reguły same-origin:

Strefy Zaufania
Jeśli obie domeny znajdują się w strefie wysokiego zaufania (np. firmowe domeny intranetu), wówczas ograniczenia same-origin nie są stosowane.
Port
IE nie bierze pod uwagę portów w trakcie sprawdzania obecności tego samego pochodzenia. Przykładowo, https://company.com:81/index.html i https://company.com/index.html są uznawane za posiadające ten sam "origin", więc nie są implementowane żadne ograniczenia .

Wspomniane wyjątki są niestandardowe i nie są wspierane przez inne przeglądarki.

Zmiana origin

Strona może zmieniać swoje pochodzenie przy zachowaniu pewnych ograniczeń. Skrypt może nadać wartość {{domxref("document.domain")}} równą swojej obecnej domenie lub superdomenie swojej obecnej domeny. Jeśli odwołuje się do superdomeny obecnej domeny, wówczas krótsza superdomena jest brana pod uwagę przy kontroli same-origin.

Załóżmy, że skrypt z dokumentu pod adresem http://store.company.com/dir/other.html wywołuje poniższą linijkę:

document.domain = "company.com";

Następnie strona może przejść pomyślnie kontrolę same-origin mając adres http://company.com/dir/page.html (przyjmując, że http://company.com/dir/page.html ma document.domain równe "company.com" by wskazać, że chce na to zezwalać - sprawdź: {{domxref("document.domain")}}). Jednakże, company.com nie może ustawić document.domain na othercompany.com, ponieważ nie jest to superdomena company.com.

Numer portu jest sprawdzany oddzielnie przez przeglądarkę. Każde odwołanie do document.domain, w tym document.domain = document.domain, spowoduje przypisanie numerowi portu wartości null. Jednakże, nie uda się nawiązać komunikacji company.com:8080 z company.com tylko poprzez umieszczenie document.domain = "company.com" w pierwszym z nich. Taki zapis musi znajdować się w obu dokumentach, aby ich porty były równocześnie równe null.

Zauważ: Używając document.domain , żeby pozwolić subdomenie na bezpieczny dostęp do rodzica potrzebujesz ustawić document.domain na tę samą wartość jednocześnie w domenie rodzica i w subdomenie. Jest to wymagane nawet podczas zwykłego przywracania domeny rodzica do pierwotnej wartości. Niepowodzenie może skutkować błędami dostępu.

Dostęp sieciowy cross-origin (międzyźródłowy)

Reguła tego samego pochodzenia kontroluje interakcje pomiędzy dwoma różnymi "originami", np. kiedy używasz elementu {{domxref("XMLHttpRequest")}} czy {{htmlelement("img")}}. Tego typu interakcje przeważnie dzielą się na trzy kategorie:

Poniżej znajdują się przykłady zasobów, które można osadzać międzyźródłowo:

Jak umożliwić dostęp cross-origin

Poprzez CORS można zezwolić na dostęp cross-origin. CORS jest częścią {{Glossary("HTTP")}}, co pozwala serwerom na określanie, które hosty są upoważnione do ładowania treści z tego serweru.

Jak zablokować dostęp cross-origin

Dostęp cross-origin API skryptu

API JavaScriptu, jak {{domxref("HTMLIFrameElement.contentWindow", "iframe.contentWindow")}}, {{domxref("window.parent")}}, {{domxref("window.open")}} i {{domxref("window.opener")}} pozwalają dokumentom na bezpośrednią, wzajemną referencję. Jeśli dwa dokumenty nie są tego samego pochodzenia, referencje te umożliwiają bardzo ograniczony dostęp do obiektów {{domxref("Window")}} i {{domxref("Location")}}, jako opisano w następnych dwóch sekcjach.

Do komunikacji pomiędzy dokumentami o różnym pochodzeniu stosuje się {{domxref("window.postMessage")}}.

Specyfikacja: Standard HTML § Obiekty cross-origin.

Window

Poniższy dostęp cross-origin jest dopuszczany w przypadku wymienionych właściwości Window:

Metody
{{domxref("window.blur")}}
{{domxref("window.close")}}
{{domxref("window.focus")}}
{{domxref("window.postMessage")}}
Własności
{{domxref("window.closed")}} Tylko do odczytu.
{{domxref("window.frames")}} Tylko do odczytu.
{{domxref("window.length")}} Tylko do odczytu.
{{domxref("window.location")}} Odczyt/Zapis.
{{domxref("window.opener")}} Tylko do odczytu.
{{domxref("window.parent")}} Tylko do odczytu.
{{domxref("window.self")}} Tylko do odczytu.
{{domxref("window.top")}} Tylko do odczytu.
{{domxref("window.window")}} Tylko do odczytu.

Niektóre przeglądarki zezwalają na dostęp większej ilości właściwości, niż wypisane powyżej.

Location

Poniższy dostęp cross-origin jest dopuszczany w przypadku właściwości Location:

Metody
{{domxref("location.replace")}}
Atrybuty
{{domxref("URLUtils.href")}} Tylko do zapisu.

Niektóre przeglądarki umożliwiają dostęp do większej liczby właściwości, niż wymienione powyżej.

Dostęp cross-origin do danych pamięci

Dostęp do danych przechowywanych w przeglądarce, jak localStorage czy IndexedDB są odseparowane pochodzeniem. Każdy origin otrzymuje własną, odseparowaną pamięć i JavaScript jednego pochodzenia nie może odczytywać lub wpisywać niczego do pamięci należącej do innego originu.

Ciasteczka (cookies) używają oddzielnej definicji originów. Strona może ustalić ciasteczko dla własnej domeny lub domeny-rodzica dopóki, gdy domena-rodzic nie jest sufiksem publicznym. Firefox i Chrome używają listy sufiksów publicznych (Public Suffix List), by zweryfikować czy domena jest sufiksem publicznym. Internet Explorer używa własnej, wewnątrznej metody weryfikacji czy domena jest sufiksem publicznym. Przeglądarka udostępni ciasteczko podanej domenie zawierającej jakiekolwiek subdomeny, niezależnie jaki protokół (HTTP/HTTPS) czy port jest używany. Przy ustalaniu ciasteczka możliwe jest określenie limitu dostępności używając flag domeny (Domain), ścieżki (Path), bezpiecznej (Secure) i Http-Only. Gdy odczytywane jest ciasteczko nie można zobaczyć, gdzie zostało ustalone. Nawet jeśli używane są wyłącznie bezpieczne połączenia https dane ciasteczko mogło zostać ustalone poprzez połączenie niebezpieczne.

Zobacz również

Informacje dot. dokumentu źródłowego

{{QuickLinksWithSubpages("/en-US/docs/Web/Security")}}