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.


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

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 .


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.