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łszowany Origin
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łszowany Access-Control-Allow-Origin
nagłówek z powrotem do przeglądarki.
Dokumentacja, którą przeczytałem, stwierdza, że Access-Control-Allow-Origin
otrzymana wartość musi Origin
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:
Nie można załadować XMLHttpRequest http://server.dev/test
. Nagłówek „Access-Control-Allow-Origin” ma wartość, http://client1.dev
która nie jest równa podanemu pochodzeniu. http://client2.dev
Dlatego Origin nie ma dostępu.
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ło http://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.
foo.com
), musi dostarczaćAccess-Control-Allow-Origin
nagłówek, w przeciwnym razie przeglądarka nie zezwala na żądaniebar.com
.