Co dokładnie robi nagłówek Access-Control-Allow-Credentials?

167

Próbuję zrozumieć, jak używać CORS i jestem zdezorientowany, co Access-Control-Allow-Credentialsrobi nagłówek.

Dokumentacja mówi

Wskazuje, czy odpowiedź na żądanie może być ujawniona, gdy flaga poświadczeń ma wartość true.

Ale nie rozumiem, co oznacza „ujawnienie” odpowiedzi.

Czy ktoś może wyjaśnić, co ten nagłówek jest ustawiony na true (w połączeniu z flagą poświadczeń ustawioną na true) tak naprawdę robi?

Nate
źródło
xhr.withCredential doc po stronie klienta developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/…
Weishi Zeng

Odpowiedzi:

265

Domyślnie CORS nie uwzględnia plików cookie w żądaniach między źródłami. Różni się to od innych technik pochodzących z różnych źródeł, takich jak JSON-P. JSON-P zawsze zawiera pliki cookie z żądaniem, a to zachowanie może prowadzić do pewnej klasy luk zwanej fałszowaniem żądań między lokacjami lub CSRF.

Aby zmniejszyć prawdopodobieństwo wystąpienia luk CSRF w CORS, CORS wymaga, aby zarówno serwer, jak i klient potwierdzili, że umieszczanie plików cookie w żądaniach jest w porządku. Dzięki temu pliki cookie stają się aktywną decyzją, a nie czymś, co dzieje się biernie bez żadnej kontroli.

Kod klienta należy ustawić withCredentialswłaściwość na XMLHttpRequestcelu true, aby dać zgodę.

Jednak sam ten nagłówek nie wystarczy. Serwer musi odpowiedzieć Access-Control-Allow-Credentialsnagłówkiem. Odpowiedź za pomocą tego nagłówka trueoznacza, że ​​serwer zezwala na dołączanie plików cookie (lub innych danych uwierzytelniających użytkownika) do żądań z innych źródeł.

Musisz również upewnić się, że Twoja przeglądarka nie blokuje plików cookie innych firm, jeśli chcesz, aby żądania uwierzytelniające z różnych źródeł działały.

Pamiętaj, że niezależnie od tego, czy wysyłasz żądania z tego samego, czy z różnych źródeł, musisz chronić swoją witrynę przed CSRF (zwłaszcza jeśli żądanie zawiera pliki cookie).

monsur
źródło
1
Wyjaśniłem odpowiedź, aby odpowiedzieć na twoje pytanie. Zasadniczo JSON-P robi to źle i jest mniej bezpieczny.
monsur,
28
Chcę tylko trochę do tego dodać, aby skomentować znaczenie słowa „ujawniony”. Specyfikacja nie wymaga przed lotem (dodatkowej podróży w obie strony, aby sprawdzić, czy serwer zezwoli na poświadczenia) dla żądań GET. Zamiast przeprowadzania inspekcji wstępnej przeglądarka zawsze wysyła żądanie, wysyłając pliki cookie, jeśli withCredentialsjest ustawiona, ale potem, gdy otrzyma odpowiedź, jeśli ustawiono withCredentials, dostarczy / ujawni wynik do wywołującego javascript tylko wtedy, gdy odpowiedź ma Access Zestaw nagłówków -Control-Allow-Credentials. Jeśli nie ma nagłówka, nie ujawnia odpowiedzi, skutecznie ją wprowadzając na czarno.
heavy5ide
4
@ heavi5ide, tak, nawet jeśli przeglądarka nie ujawnia odpowiedzi na kod klienta, żądanie z plikiem cookie było nadal wysyłane (dla żądań nieprefleksowanych). Więc CSRF nadal byłby wykonywany.
Pacerier,
7
Ponieważ jest to tak popularna odpowiedź, dodam jeszcze jedną ważną informację: oprócz poprawnej konfiguracji nagłówków żądań i odpowiedzi, musisz również upewnić się, że Twoja przeglądarka nie blokuje plików cookie innych firm, jeśli chcą, aby żądania poświadczeń z różnych źródeł działały. Zobacz stackoverflow.com/a/16634887/2970321
alexw
5
To jest tak jasna odpowiedź, że każdy, kto czyta ją po raz pierwszy, może zrozumieć i naprawić swój kod, który wydaje się nie działać dobrze z plikami cookie. Dzięki!
asgs