Zapytania HTTP - okładka

Zapytania HTTP – zestaw przydatnych narzędzi

Opublikowano Kategorie PozostałeCzas czytania 10min

Praktycznie każda osoba z dostępem do Internetu, mniej lub bardziej świadomie, korzysta z protokołu HTTP. Jeśli czytasz ten wpis, to zapewne należysz do tych świadomych użytkowników.  Gdybyś jednak należał(a) do tej drugiej grupy, to nic straconego. Na MDN znajdziesz świetne wprowadzenie, do tego, czym jest protokół HTTP i jak z nim pracować. Gorąco rekomenduję Ci zapoznanie się z nim przed dalszą lekturą. W tym wpisie przedstawię kilka narzędzi, które pozwolą Ci usprawnić pracę z tym protokołem.

Mimo że większość narzędzi oferuje podobne spektrum możliwości, to zachęcam Cię do samodzielnego wypróbowania każdego z nich. Wszystkie przykłady z tego artykułu korzystają z The Rick and Morty API, do którego dokumentację znajdziesz pod tym linkiem.

cURL

cURL jest narzędziem, które nie tyle, co warto znać, a wręcz należy. Głównym powodem jest jego dostępność. Dzięki temu, że cURL jest narzędziem wiersza poleceń, można go wykorzystać na praktycznie każdym powszechnie wykorzystywanym systemie operacyjnym. Można go uruchomić zarówno na systemie Windows, jak i systemach Linuxowych i na komputerach od Apple. Jest to szczególnie przydatne, gdy nie posiadasz dostępu do interfejsu graficznego. Mowa tu o takich sytuacjach jak:

  • uruchamianie zadań na serwerach ciągłej integracji;
  • uruchamianie skryptów automatyzujących pracę;
  • budowanie obrazów dockerowych;
  • pracy na serwerze z wykorzystaniem połączenia SSH.

Zachęcam do podzielenia się innymi przykładami w komentarzu.

Podstawowe wykorzystanie cURLa ogranicza się do wykonania polecenia curl http://example.com w CLI. W celu potwierdzenia, że cURL działa jak należy, wykonaj polecenie curl https://rickandmortyapi.com/api/character. W rezultacie powinien zostać zwrócony dość masywny obiekt w formacie JSON.

CURL - wykorzystanie

Jak widać czytelność zwróconego rezultatu, pozostawia wiele do życzenia. Z pomocą przychodzi json_pp, do którego można przekazać wynik zapytania. W tym celu można wykorzystać pipe operator (symbol |). Powtarzając wcześniejsze zapytanie z wykorzystaniem json_pp, otrzymany rezultat jest o wiele bardziej czytelny.

CURL - wykorzystanie json_pp

Parametry cURLa

Podobnie do innych narzędzi wiersza poleceń, cURL jest sterowany parametrami. Poniżej znajdziesz najczęściej wykorzystywane parametry:

  • -H — Odpowiada za przekazywanie dodatkowych nagłówków do zapytania. Dzięki temu możesz przekazać do zapytania, na przykład, oczekiwany Content-Type. Jest to szczególnie przydatne, gdy dany endpoint zwraca dane w kilku formatach. Innym zastosowaniem może być przekazanie tokenów uwierzytelniających. Przykładowe wykorzystanie: curl -H 'Content-Type: application/json' https://rickandmortyapi.com/api/character.
  • -v — Flaga uruchamia tryb verbose dla wykonanego zapytania. Pozwala to na uzyskanie szczegółów dotyczących połączenia tj. przebieg TLS handshake, szczegóły certyfikatu SSL czy nagłówki odpowiedzi. Tryb verbose będzie szczególnie przydatny, gdy potrzebujesz zdebuggować problemy z połączeniem HTTP czy certyfikatem SSL. Zawartość samych nagłówków można pozyskać wykorzystując flagę -I, natomiast zapytanie wraz z nagłówkami zwróci zapytanie wzbogacone flagą -i. Zwróć uwagę, że w tym przypadku rozmiar ma znaczenie 🙂
  • -X — Domyślną metodą wykorzystywaną przez cURLa jest metoda GET. Aby wykorzystać inną metodę HTTP, należy wykorzystać flagę -X. Przykładowe wykorzystanie: curl -X OPTIONS https://rickandmortyapi.com/api/character -i. Zapytanie zwróci informację, jakich metod można użyć dla wskazanego endpointu. Zachęcam do porównania rezultatów zapytania z zapytaniami curl https://rickandmortyapi.com/api/character -I oraz curl https://rickandmortyapi.com/api/character -i.
  • -d — Parametr pozwala na konstruowanie ciała zapytania dla zapytań typu POST, PUTPATCH. Przykładowe zapytanie: curl -X POST https://rickandmortyapi.com/api/character -H "Content-Type: application/json" -d '{"key": "value"}'. Niestety The Rick and Morty API nie pozwala na dodawanie, edycję i usuwanie zasobów. Do tego celu możesz wykorzystać narzędzie do tworzenia tymczasowych API — Beeceptor. Wystarczy, że zdefiniujesz tymczasową ścieżkę, a następnie wyślesz zapytanie pod wskazany adres. W przypadku parametrów zapytania (query params), nie ma potrzeby definiowania ich za pomocą dodatkowych parametrów.
  • -A — Niektóre strony WWW i API blokują ruch, który nie wygląda na ruch prawdziwego użytkownika. W tym celu możesz spróbować ustawić user agenta na nieco bardziej autentycznego: curl -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' https://rickandmortyapi.com/api/character.
  • --json — Ekwiwalent zestawu nagłówków -H 'Content-Type: application/json' -H 'Accept: application/json'.

Oczywiście nie jest to kompletna lista parametrów cURL-a. Jednakże przedstawianie wszystkich możliwych opcji tym wpisie mija się z celem. Jeśli potrzebujesz znaleźć odpowiedni parametr lub nie wiesz jak z niego skorzystać, możesz posłużyć się poleceniami:

  • curl --help — lista najpotrzebniejszych parametrów cURL-a;
  • curl --help all — lista wszystkich parametrów cURL-a;
  • man curl — szczegółowa instrukcja obsługi cURL-a wraz z przykładami.

Warto jeszcze dodać, że wykorzystanie cURL-a nie ogranicza się do protokołu HTTP. Możesz go również wykorzystać do pracy z innymi protokołami takimi jak FTP, SMTP, POP3, IMAP, SCP, WS czy SMB. Pełną listę wspieranych protokołów znajdziesz w manualu.

Postman

Postman, oprócz cURLa, jest chyba jednym z najbardziej rozpoznawalnych narzędzi do pracy z protokołem HTTP. Aby zacząć korzystać z Postmana należy pobrać i zainstalować klienta. Najlepiej tego dokonać korzystając z oficjalnej strony. Po pobraniu i uruchomieniu aplikacji czas na wykonanie pierwszego zapytania. W pole obok niebieskiego przycisku send należy wprowadzić przykładowe adres URL i kliknąć przycisk. Rezultatem będzie wykonanie wskazanego zapytania.

Postman - przykładowe zapytanie

W oczy rzuca się przede wszystkim sformatowany rezultat zapytania, kod odpowiedzi, czas wykonania oraz jego rozmiar. Klikając w kolejne zakładki, można podejrzeć wykorzystane ciasteczka oraz nagłówki odpowiedzi. Po lewej stronie pola dla adresu URL można wybrać metodę HTTP. W przypadku bardziej skomplikowanych zapytań przydatne są pozostałe zakładki:

  • Params — służy do definiowania query params zapytania w formacie klucz/wartość;
  • Authorization — w tej zakładce można skonfigurować sposób uwierzytelniania np. OAuth, API Key czy Bearer Token;
  • Headers — tutaj definiowane są nagłówki zapytania w formacie klucz/wartość;
  • Body — pozwala na zdefiniowanie ciała zapytania. Możliwe jest to w formie JSON-a, w formacie klucz/wartość, ale też w formacie form-data, dzięki czemu możliwe jest przesyłanie plików;
  • Pre-request Scripts — ta sekcja umożliwia zdefiniowanie skryptów JavaScript, które wykonają się przed zapytaniem. Pozwala to, na przykład, na dynamiczne generowanie elementów zapytań;
  • Tests — analogicznie do poprzedniej sekcji z tą różnicą, że kod wykonywany jest po wykonaniu zapytania. Dzięki temu można przygotować testy odpowiedzi;
  • Settings — tutaj twórcy ukryli pozostałe opcje, które mogą Cię zainteresować.

Każde wykonane zapytanie, po jego wykonaniu, zostaje zapisane w historii. Listę wykonanych zapytań można podejrzeć, klikając w zakładkę History. Możesz również założyć konto w serwisie Postmana, aby mieć dostęp do rezultatów swojej pracy na innych urządzeniach.

Kolekcje

Na szczególną uwagę zasługują kolekcje. Kolekcje są zestawami uprzednio przygotowanych już zapytań. Kolekcje można zarówno tworzyć na własną rękę, jak i korzystać z gotowych kolekcji. Postman udostępnia repozytorium z kolekcjami dla popularnych publicznych API, na przykład Twittera czy Notion. Korzystając z kolekcji, można w prosty sposób przygotować środowisko testowe dla testów manualnych Twojej aplikacji. Zamiast ręcznie definiować każde zapytanie, wystarczy, że w swoim repozytorium zamieścisz wyeksportowane definicje kolekcji w formacie JSON. Dzięki temu każda osoba zaangażowana w proces testowania będzie w stanie w bardzo szybki sposób uruchomić środowisko testowe. Kolekcje są też świetnym sposobem na przygotowanie demo dla Twojej aplikacji, dzięki czemu wdrożenie aplikacji dla klientów będzie znacznie prostsze.

Insomnia

Konkurencyjnym rozwiązaniem dla Postmana jest Insomnia. Narzędzie oferuje zbliżone zakres możliwości do Postmana. Analogicznie jak w poprzednim przypadku, pracę z Insomnią należy rozpocząć poprzez pobranie instalatora z oficjalnej strony. Po instalacji i uruchomieniu programu wystarczy uzupełnić pole w środkowym panelu i kliknąć przycisk Send. Po wykonaniu zapytania, w panelu po prawej stronie przedstawione zostanie podsumowanie zawierające te same informacje co podsumowanie w aplikacji Postman. Dodatkowo w zakładce Timeline można podejrzeć rezultat taki jak w przypadku użycia flagi -v dla cURLa. Przykładowy rezultat został przedstawiony na zrzucie ekranu poniżej.

Insomnia - przykładowe zapytanie HTTP

Tak jak w przypadku Postmana, tak i tutaj możliwe jest rozszerzenie zapytania o dodatkowe nagłówki, wybór metody, zdefiniowanie body zapytania itp.. Historię zapytań można podejrzeć, klikając w rozwijaną listę znajdującą się pod przyciskiem Sign Up. Niestety, historia zapytań czyści się po zamknięciu aplikacji. Kolejną wspólną cechą obydwu programów jest możliwość definiowania kolekcji. W Insomnii również możliwy jest eksport oraz import kolekcji w postaci pliku JSON z przygotowaną listą zapytań.

Hoppscotch

Hoppscotch dla użytkowników Postmana będzie wyglądał znajomo. Wygląda jak uproszczony webowy klient Postmana, a jego interfejs wygląda wręcz bliźniaczo.

Hoppscotch - przykładowe zapytanie HTTP

Co prawda brakuje części opcji, które udostępnia Postman, ale możliwości nadal są spore. Dla niektórych użytkowników prostota i brak zaawansowanych opcji może wręcz stanowić zaletę.

Oprócz zapytań HTTP, możliwe jest też wykonywanie zapytań GraphQL oraz z wykorzystaniem protokołu WebSocket. Dodatkową zaletą Hoppscotcha jest jego otwartoźródłowy charakter, dzięki czemu możliwe jest postawienie lokalnej, odizolowanej od świata zewnętrznego instancji.

Burp

Na sam koniec zostawiłem nieco odmienne, ale równie przydatne narzędzie. Burp jest aplikacją proxy dla zapytań HTTP wysyłanych za pomocą przeglądarki. Pozwala on na przechwytywanie oraz modyfikację wysyłanych zapytań „w locie”. Oprócz przechwytywania i modyfikacji zapytań Burp daje możliwość powtarzania zapytań poprzez Repeater czy przygotowanie zapytań z dynamicznie wstrzykiwanymi wartościami z wykorzystaniem Intrudera. Dzięki Intruderowi możliwe jest wysłanie wielu zapytań różniących się jedynie dynamicznie wstrzykiwanymi wartościami. Można dzięki temu przeprowadzić np. atak z wykorzystaniem enumeracji. Innym, przydatnym mechanizmem Decoder pozwalający na kodowanie i dekodowanie wartości przy użyciu popularnych mechanizmów kodowania danych tj. Base64, GZIP, ASCII czy Hex. Burpowi został poświęcony bardzo obszerny artykuł na Sekuraku, gdzie ze szczegółami zostały opisane wszystkie wspomniane przeze mnie moduły. Temat ten został tam ZNACZNIE rozszerzony, stąd też zainteresowanych odsyłam właśnie tam. Artykuł szczególnie rekomenduję początkującym pentesterom.

Podsumowanie

Narzędzi do pracy z HTTP jest znacznie więcej. Przedstawiłem tylko te, z którymi miałem przyjemność pracować. Jestem ciekaw, jakie narzędzia Ty wykorzystujesz, dlatego zachęcam do zostawienia komentarza pod wpisem. Zechęcam też do zapoznania się z materiałami dodakowymi poniżej.

Źródła i materiały dodatkowe

Dominik Szczepaniak

Zawodowo Senior Software Engineer w CKSource. Prywatnie bloger, fan włoskiej kuchni, miłośnik jazdy na rowerze i treningu siłowego.

Inne wpisy, które mogą Cię zainteresować

Zapisz się na mailing i odbierz e-booka

Odbierz darmowy egzemplarz e-booka 106 Pytań Rekrutacyjnych Junior JavaScript Developer i realnie zwiększ swoje szanse na rozmowie rekrutacyjnej! Będziesz też otrzymywać wartościowe treści i powiadomienia o nowych wpisach na skrzynkę e-mail.

Subscribe
Powiadom o
guest

0 komentarzy
oceniany
najnowszy najstarszy
Inline Feedbacks
View all comments