Jaka była motywacja do wprowadzenia wniosków o przeprowadzenie inspekcji wstępnej?
Wprowadzono żądania inspekcji wstępnej, aby przeglądarka mogła mieć pewność, że ma do czynienia z serwerem obsługującym CORS przed wysłaniem określonych żądań. Te żądania zostały zdefiniowane jako te, które były zarówno potencjalnie niebezpieczne (zmieniające stan), jak i nowe (niemożliwe przed CORS ze względu na te same zasady pochodzenia ). Korzystanie z żądań inspekcji wstępnej oznacza, że serwery muszą wyrazić zgodę (odpowiednio reagując na inspekcję wstępną) na nowe, potencjalnie niebezpieczne typy żądań, które umożliwia CORS.
Takie jest znaczenie tej części specyfikacji : „Aby chronić zasoby przed żądaniami pochodzącymi z różnych źródeł, które nie mogły pochodzić od niektórych programów użytkownika, zanim istniała ta specyfikacja, wysyłane jest żądanie sprawdzenia wstępnego w celu zapewnienia, że zasób zna tę specyfikację”.
Czy możesz podać mi przykład?
Wyobraźmy sobie, że użytkownik przeglądarki jest zalogowany na swojej stronie bankowej pod adresem A.com
. Gdy przechodzą do złośliwego oprogramowania B.com
, ta strona zawiera kod JavaScript, który próbuje wysłać DELETE
żądanie A.com/account
. Ponieważ użytkownik jest zalogowany A.com
, żądanie to, jeśli zostanie wysłane, będzie zawierać pliki cookie, które identyfikują użytkownika.
Przed wersją CORS zasady tego samego pochodzenia przeglądarki blokowałyby wysyłanie tego żądania. Ale ponieważ celem CORS jest umożliwienie właśnie tego rodzaju komunikacji krzyżowej, nie jest to już właściwe.
Przeglądarka może po prostu wysłać DELETE
i pozwolić serwerowi zdecydować, jak sobie z tym poradzić. Ale co, jeśli A.com
nie jest świadomy protokołu CORS? Może pójść naprzód i wykonać niebezpieczne DELETE
. Mogłoby się założyć, że - z powodu Polityki samego pochodzenia przeglądarki - nigdy nie może otrzymać takiego żądania, a zatem nigdy nie byłby zahartowany przed takim atakiem.
Aby chronić takie serwery nieobsługujące CORS, protokół wymaga, aby przeglądarka najpierw wysłała żądanie inspekcji wstępnej . Ten nowy rodzaj żądania jest czymś, na co tylko serwery obsługujące CORS mogą odpowiedzieć poprawnie, umożliwiając przeglądarce sprawdzenie, czy wysyłanie rzeczywistych jest bezpieczne DELETE
.
Dlaczego całe to zamieszanie związane z przeglądarką, czy osoba atakująca nie może po prostu wysłać DELETE
żądania z własnego komputera?
Jasne, ale takie żądanie nie będzie zawierać plików cookie użytkownika. Atak, którego celem jest zapobieganie, polega na tym, że przeglądarka wysyła pliki cookie (w szczególności informacje uwierzytelniające dla użytkownika) dla drugiej domeny wraz z żądaniem.
To brzmi jak żądanie Cross-Site Fałszerstwo , jeżeli formularz na stronie B.com
puszki POST
do A.com
ciasteczek użytkownika i zrobić uszkodzenia.
Zgadza się. Innym sposobem na określenie tego jest to, że prośby o przeprowadzenie inspekcji wstępnej zostały utworzone, aby nie zwiększać powierzchni ataku CSRF dla serwerów nieobsługujących CORS.
Ale patrząc na wymagania dotyczące „prostych” żądań, które nie wymagają inspekcji wstępnej, widzę, że POST
jest to nadal dozwolone. To może zmienić stan i usunąć dane tak jak DELETE
!
To prawda! CORS nie chroni witryny przed atakami CSRF. Z drugiej strony, bez CORS nie jesteś również chroniony przed atakami CSRF. Celem wniosków o przeprowadzenie inspekcji wstępnej jest ograniczenie ekspozycji CSRF do tego, co już istniało w świecie sprzed CORS.
Westchnienie. OK, niechętnie akceptuję potrzebę wniosków o inspekcję wstępną. Ale dlaczego musimy to robić dla każdego zasobu (adresu URL) na serwerze? Serwer albo obsługuje CORS, albo nie.
Jesteś pewien? Często zdarza się, że wiele serwerów obsługuje żądania dotyczące jednej domeny. Na przykład może być tak, że żądania A.com/url1
obsługiwane są przez jeden rodzaj serwera, a żądania A.com/url2
obsługiwane przez inny rodzaj serwera. Zasadniczo serwer obsługujący pojedynczy zasób nie może gwarantować bezpieczeństwa wszystkich zasobów w tej domenie.
W porządku. Kompromis. Utwórzmy nowy nagłówek CORS, który pozwala serwerowi dokładnie określić, za które zasoby może mówić, aby uniknąć dodatkowych żądań inspekcji wstępnej do tych adresów URL.
Dobry pomysł! W rzeczywistości nagłówek Access-Control-Policy-Path
został zaproponowany tylko w tym celu. Ostatecznie jednak został pominięty w specyfikacji, najwyraźniej dlatego , że niektóre serwery nieprawidłowo zaimplementowały specyfikację URI w taki sposób, że żądania do ścieżek, które wydawały się bezpieczne dla przeglądarki, w rzeczywistości nie byłyby bezpieczne na uszkodzonych serwerach.
Czy była to rozważna decyzja, w której priorytetem było bezpieczeństwo zamiast wydajności, pozwalając przeglądarkom na natychmiastowe wdrożenie specyfikacji CORS bez narażania istniejących serwerów? A może krótkowzroczność skazała internet na marnowanie przepustowości i podwójne opóźnienie tylko po to, aby pomieścić błędy na danym serwerze w określonym czasie?
Opinie się różnią.
Cóż, przynajmniej przeglądarki będą buforować inspekcję wstępną dla jednego adresu URL?
Tak. Chociaż prawdopodobnie nie na długo. W przeglądarkach WebKit maksymalny czas pamięci podręcznej inspekcji wstępnej wynosi obecnie 10 minut .
Westchnienie. Cóż, jeśli wiem, że moje serwery obsługują CORS i dlatego nie potrzebują ochrony oferowanej przez żądania inspekcji wstępnej, czy mogę w jakiś sposób ich uniknąć?
Jedyną prawdziwą opcją jest upewnienie się, że spełniasz wymagania dla „prostych” żądań. Może to oznaczać pominięcie niestandardowych nagłówków, które w innym przypadku uwzględniałbyś (np. X-Requested-With
), Kłamanie na temat Content-Type
lub więcej.
Cokolwiek robisz, musisz upewnić się, że masz odpowiednie zabezpieczenia CSRF, ponieważ specyfikacja CORS nie dotyczy odrzucania „prostych” żądań, w tym niebezpiecznych POST
. Zgodnie ze specyfikacją : „zasoby, dla których proste żądania mają znaczenie inne niż pobieranie, muszą chronić się przed fałszowaniem żądań między witrynami”.