Tak jak rozumiem, jeśli skrypt po stronie klienta działający na stronie z foo.com chce zażądać danych z bar.com, w żądaniu musi określić nagłówek Origin: http://foo.com
, a bar musi odpowiedzieć Access-Control-Allow-Origin: http://foo.com
.
Co ma powstrzymać złośliwy kod z witryny roh.com przed zwykłym sfałszowaniem nagłówka w Origin: http://foo.com
celu zażądania stron z paska?
javascript
ajax
http
cors
Jay Lamont
źródło
źródło
foo.com
), musi dostarczaćAccess-Control-Allow-Origin
nagłówek, w przeciwnym razie przeglądarka nie zezwala na żądaniebar.com
.Odpowiedzi:
Przeglądarki kontrolują ustawienie
Origin
nagłówka, a użytkownicy nie mogą zastąpić tej wartości. Więc nie zobaczyszOrigin
nagłówka sfałszowanego z przeglądarki. Złośliwy użytkownik może stworzyć żądanie curl, które ręcznie ustawiaOrigin
nagłówek, ale żądanie to pochodziło spoza przeglądarki i może nie zawierać informacji specyficznych dla przeglądarki (takich jak pliki cookie).Pamiętaj: CORS nie jest zabezpieczeniem. Nie polegaj na CORS, aby zabezpieczyć swoją witrynę. Jeśli udostępniasz chronione dane, użyj plików cookie lub tokenów OAuth lub czegoś innego niż
Origin
nagłówek, aby zabezpieczyć te dane.Access-Control-Allow-Origin
Nagłówek w CORS tylko dyktuje której początki powinny mieć możliwość dokonania żądań między pochodzenia. Nie polegaj na tym w niczym więcej.źródło
TLDR: nic nie stoi na przeszkodzie , aby złośliwy kod sfałszował pochodzenie. Kiedy tak się stanie, Twój serwer nigdy się o tym nie dowie i będzie reagował na żądania. Czasami te prośby są drogie. Więc nie używaj CORS zamiast żadnego rodzaju zabezpieczeń.
Ostatnio bawiłem się CORS-em i zadałem sobie to samo pytanie. Odkryłem, że przeglądarka może być wystarczająco inteligentna, aby rozpoznać sfałszowane żądanie CORS, gdy je zobaczy, ale twój serwer nie jest tak inteligentny.
Pierwszą rzeczą, jaką znalazłem, było to, że
Origin
nagłówek jest nazwą nagłówka zabronionego przez HTTP , której nie można modyfikować programowo. Oznacza to, że możesz go zmodyfikować w około 8 sekund za pomocą Modyfikuj nagłówki dla Google Chrome .Aby to przetestować, skonfigurowałem dwie domeny klienckie i jedną domenę serwera. Dodałem białą listę CORS na serwerze, która zezwalała na żądania CORS od klienta 1, ale nie od klienta 2. Przetestowałem obu klientów i rzeczywiście żądania CORS klienta 1 zakończyły się powodzeniem, podczas gdy klient 2 zawiódł.
Następnie sfałszowałem
Origin
nagłówek Klienta 2, aby pasował do nagłówka Klienta 1. Serwer otrzymał sfałszowanyOrigin
nagłówek i pomyślnie przeszedł kontrolę białej listy (lub nie powiódł się, jeśli jesteś typem do połowy pustej szklanki). Następnie serwer sumiennie działał, zużywając wszystkie zasoby, które był przeznaczony do wykorzystania (wywołania bazy danych, wysyłanie drogich e-maili, wysyłanie jeszcze droższych wiadomości SMS itp.). Kiedy to się stało, serwer szczęśliwie wysłał sfałszowanyAccess-Control-Allow-Origin
nagłówek z powrotem do przeglądarki.Dokumentacja, którą przeczytałem, stwierdza, że
Access-Control-Allow-Origin
otrzymana wartość musiOrigin
dokładnie odpowiadać wartości przesłanej w żądaniu. Pasują do siebie, więc byłem zaskoczony, gdy zobaczyłem następujący komunikat w Chrome:Dokumentacja, którą przeczytałem, nie wydaje się być dokładna. Karta sieciowa Chrome wyraźnie pokazuje zarówno nagłówki żądań, jak i odpowiedzi jako
http://client1.dev
, ale możesz zobaczyć w błędzie, że Chrome w jakiś sposób wie, że prawdziwe źródło byłohttp://client2.dev
i poprawnie odrzuca odpowiedź. W tym momencie nie ma to znaczenia, ponieważ serwer już przyjął sfałszowane żądanie i wydał moje pieniądze.źródło
There's nothing stopping malicious code from spoofing the origin
-> Tak, nie można ustawić javascriptOrigin
. Tak, użytkownik może zmodyfikować swoją przeglądarkę / użyć skrzypka, aby zmienić pochodzenie, ale CORS nie przed tym broni się; Strony internetowe kontrolowane przez atakujących nie mogą zmienić Origin, i to jest jedyne, co się liczy.Tylko skromne podsumowanie:
P: Czy polityka tego samego pochodzenia (SOP) jest egzekwowana tylko przez przeglądarki?
ZA: tak. W przypadku wszystkich połączeń wykonywanych w przeglądarce SOP jest zdecydowanie stosowana przez przeglądarkę. Serwer może sprawdzić pochodzenie żądania lub nie.
P: Jeśli żądanie nie jest zgodne z SOP, czy przeglądarka je blokuje?
O: Nie, przeglądarki nie mają do tego uprawnień. Przeglądarki po prostu wysyłają żądania z różnych źródeł i czekają na odpowiedź, aby sprawdzić, czy połączenie jest sygnalizowane przez serwer za pośrednictwem
Access-Control
nagłówków - *. Jeśli serwer nie odsyłaAccess-Control-Allow-Origin
nagłówka zwrotnego, nie odsyła echa z powrotem do źródła wywołującego lub nie odsyła*
w nagłówku, to jedyną rzeczą, jaką zrobi przeglądarka, jest powstrzymanie się od dostarczenia odpowiedzi dzwoniącemu.P: Czy to znaczy, że nie mogę fałszować
Origin
?O: W przeglądarce i przy użyciu skryptów nie można przesłonić,
Origin
ponieważ jest to kontrolowane przez przeglądarkę. Jeśli jednak chcesz się włamać, możesz manipulować połączeniami wychodzącymi z TWOJEJ przeglądarki za pomocą rozszerzeń przeglądarki lub innych narzędzi zainstalowanych na komputerze. Można też wydaćHTTP
połączeń za pomocącurl
,Python
,C#
, etc i zmieniaćOrigin
nagłówek do serwerów sztuczka.P: Więc jeśli mogę oszukać serwer przez zmianę
Origin
, czy to znaczy, żeCORS
nie jest bezpieczny?ZA:
CORS
per se milczy na temat bezpieczeństwa - tj. Uwierzytelniania i autoryzacji żądań. Do serwerów należy sprawdzanie żądań i uwierzytelnianie / autoryzowanie ich za pomocą dowolnego mechanizmu, z którym współpracują, takiego jak pliki cookie i nagłówki. To powiedziawszy, może nas nieco bardziej chronić w przypadku ataków typu XSS:Przykład: załóżmy, że zalogowałeś się w swojej witrynie i złośliwy skrypt próbuje wysłać żądanie do witryny banku w celu uzyskania informacji o saldzie: atak Reflected XSS . Witryna banku ufa poświadczeniom pochodzącym z (tutaj w imieniu) Twojej witryny, więc żądanie zostaje uwierzytelnione, a w odpowiedzi nagłówek. Teraz po nadejściu żądania przeglądarka zdaje sobie sprawę, że żądanie było żądaniem z różnych źródeł, ale odpowiedź nie wskazuje, że serwer był szczęśliwy, mogąc udostępnić zasób (tutaj punkt końcowy zapytania o saldo) z Twoją witryną. Tak więc przerywa przepływ, dlatego zwracany wynik nigdy nie dotrze do złośliwego kodu.
HTTP
odpowiedź mająca na celu złośliwy kod. Jeśli witryna Twojego banku nie dba o udostępnianie swoich punktów końcowych innym źródłom, nie zawieraAccess-Control-Allow-Origin
źródło