Jaki jest sens nagłówka X-Requested-With?

224

JQuery i inne frameworki dodają następujący nagłówek:

X-Requested-With: XMLHttpRequest

Dlaczego jest to potrzebne? Dlaczego serwer miałby traktować żądania AJAX inaczej niż zwykłe żądania?

AKTUALIZACJA : Właśnie znalazłem przykład z życia przy użyciu tego nagłówka: https://core.spreedly.com/manual/payment-methods/adding-with-js . Jeśli procesor płatności jest wymagany bez AJAX, po zakończeniu przekierowuje z powrotem do oryginalnej strony internetowej. Na żądanie AJAX nie następuje przekierowanie.

Gili
źródło
7
„[Gdy] zażądano bez AJAX, po zakończeniu przekierowuje z powrotem na oryginalną stronę internetową. Gdy jest to wymagane z AJAX, nie następuje przekierowanie.” -> Właśnie dlatego chciałbyś to zrobić. :)
Robert Christian
1
stackoverflow.com/questions/3315914/...
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

257

Dobry powód to bezpieczeństwo - może to zapobiec atakom CSRF, ponieważ tego nagłówka nie można dodać do domeny żądania AJAX bez zgody serwera za pośrednictwem CORS .

Dozwolone są tylko następujące nagłówki w wielu domenach:

  • Zaakceptować
  • Zaakceptuj język
  • Język treści
  • Identyfikator ostatniego zdarzenia
  • Typ zawartości

wszelkie inne powodują wysłanie żądania „przed lotem” w przeglądarkach obsługiwanych przez CORS.

Bez CORS nie można dodać X-Requested-Withdo żądania XHR między domenami.

Jeśli serwer sprawdza, czy ten nagłówek jest obecny, wie, że żądanie nie zostało zainicjowane przez domenę atakującego próbującego wysłać żądanie w imieniu użytkownika za pomocą JavaScript. Sprawdza to również, czy żądanie nie zostało wysłane z POST ze zwykłego formularza HTML, którego trudniej jest zweryfikować, czy nie jest domeną międzydomenową bez użycia tokenów. (Jednak sprawdzenie Originnagłówka może być opcją w obsługiwanych przeglądarkach, chociaż stare przeglądarki pozostaną podatne na ataki ).

Wykryto nowe obejście Flash

Możesz połączyć to z tokenem , ponieważ Flash działający w Safari na OSX może ustawić ten nagłówek, jeśli istnieje krok przekierowania . Wygląda na to, że działał również w Chrome , ale teraz został naprawiony. Więcej informacji tutaj, w tym różne wersje, których dotyczy problem.

OWASP Polecam połączenie tego z sprawdzeniem pochodzenia i referencji :

Ta technika obrony została szczegółowo omówiona w rozdziale 4.3 Solidna obrona przed fałszowaniem żądań w różnych miejscach. Jednak ominięcia tej obrony za pomocą Flasha zostały udokumentowane już w 2008 r. I ponownie jeszcze w 2015 r. Przez Mathiasa Karlssona w celu wykorzystania usterki CSRF w Vimeo. Uważamy jednak, że atak Flash nie może sfałszować nagłówków Origin ani Referer, więc sprawdzając oba z nich, uważamy, że ta kombinacja kontroli powinna zapobiec omijaniu ataków CSRF przez Flash. (UWAGA: jeśli ktokolwiek może potwierdzić lub obalić to przekonanie, daj nam znać, abyśmy mogli zaktualizować ten artykuł)

Jednak z powodów już omówionych sprawdzanie pochodzenia może być trudne.

Aktualizacja

Napisał bardziej szczegółowy post na blogu na temat CORS, CSRF i X-Requested-With tutaj .

SilverlightFox
źródło
14
Nie rozumiem Co uniemożliwia atakującemu zbudowanie żądania i dodanie również X-Requested-Withnagłówka?
Greg
13
@Greg: Przeglądarka - nie zezwala na to między domenami.
SilverlightFox
2
Och, nie zdawałem sobie sprawy, że konfiguracja CORS nie będzie potrzebna, dopóki jesteś w tej samej domenie. To oczywiste, kiedy się nad tym zastanowić. Dzięki !
Greg
10
@ vol7ron: Nic ich nie powstrzyma, ale wtedy nie będą mieć ciasteczek ofiary w żądaniu, co pokona obiekt, który je złożył. Aby CSRF powiódł się, atakujący musiałby, aby przeglądarka automatycznie dołączała pliki cookie do żądania, więc bez przeglądarki nie byłoby ataku CSRF.
SilverlightFox,
3
@ vol7ron: Były. CSRF to zagubiony problem zastępcy . Przeglądarka jest zdezorientowanym zastępcą i „oszukuje” ją w wysyłaniu plików cookie na żądanie, którego sam użytkownik nie zrobił.
SilverlightFox,
25

Upewnij się, że przeczytałeś odpowiedź SilverlightFox. Podkreśla ważniejszy powód.

Powodem jest głównie to, że jeśli znasz źródło żądania, możesz je nieco dostosować.

Załóżmy na przykład, że masz witrynę internetową z wieloma przepisami. I używasz niestandardowej struktury jQuery, aby wsuwać przepisy do pojemnika na podstawie klikniętego łącza. Link może byćwww.example.com/recipe/apple_pie

Teraz zwykle zwraca całą stronę, nagłówek, stopkę, treść przepisu i reklamy. Ale jeśli ktoś przegląda Twoją witrynę, niektóre z tych części są już załadowane. Możesz więc użyć AJAX, aby uzyskać przepis wybrany przez użytkownika, ale aby zaoszczędzić czas i przepustowość, nie ładuj nagłówka / stopki / reklam.

Teraz możesz po prostu napisać dodatkowy punkt końcowy dla danych, takich jak, www.example.com/recipe_only/apple_pieale trudniej je utrzymać i udostępnić innym osobom.

Ale łatwiej jest po prostu wykryć, że jest to zapytanie ajaxowe składające żądanie, a następnie zwracające tylko część danych. W ten sposób użytkownik marnuje mniejszą przepustowość, a strona wydaje się bardziej responsywna.

Frameworki po prostu dodają nagłówek, ponieważ niektórzy mogą uznać za przydatne śledzenie, które żądania są ajaxowe, a które nie. Ale korzystanie z takich technik jest całkowicie zależne od programisty.

W rzeczywistości przypomina trochę Accept-Languagenagłówek. Przeglądarka może poprosić o stronę internetową. Pokaż mi rosyjską wersję tej strony bez konieczności wstawiania / ru / lub podobnego adresu URL.

EWit
źródło
30
Wow, to brzmi jak koszmar z koszmaru utrzymania. Jeśli chcesz zwrócić inną reprezentację tej samej strony, powinieneś podać inny typ zawartości w Acceptnagłówku. Użycie do tego niestandardowego nagłówka wydaje się niewłaściwą drogą.
Gili,
10

Niektóre frameworki używają tego nagłówka do wykrywania żądań xhr, np. Grails Spring Security używa tego nagłówka do identyfikowania żądania xhr i udziela odpowiedzi json lub html jako odpowiedzi.

Większość bibliotek Ajax (Prototype, JQuery i Dojo od wersji 2.1) zawiera nagłówek X-Requested-With, który wskazuje, że żądanie zostało wykonane przez XMLHttpRequest, a nie jest uruchamiane przez kliknięcie zwykłego hiperłącza lub przycisku przesłania formularza.

Źródło: http://grails-plugins.github.io/grails-spring-security-core/guide/helperClasses.html

Koray Güclü
źródło