Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00255 007758 10468034 na godz. na dobę w sumie
Tworzenie bezpiecznych aplikacji internetowych (z przykładami w PHP) - książka
Tworzenie bezpiecznych aplikacji internetowych (z przykładami w PHP) - książka
Autor: Liczba stron: 208
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-8131-0 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> webmasterstwo >> php - programowanie
Porównaj ceny (książka, ebook, audiobook).

Stwórz bezpieczny sejf na dane Twoich klientów i obroń swoją aplikację!

Bezpieczeństwo złożonych, dynamicznych, interaktywnych współczesnych serwisów internetowych niejednokrotnie spędza sen z powiek projektującym je programistom. Niestety, bywa, że ich nocne koszmary zmieniają się w rzeczywistość i przygotowana przez nich strona WWW pada ofiarą złodziei (kradnących dane użytkowników) albo po prostu złośliwców, którzy czerpią przyjemność ze zniszczenia efektów cudzej pracy. Internet nie jest miejscem, w którym można pozwolić sobie na beztroskę i błędy — zwłaszcza, jeśli serwis przechowuje wrażliwe dane (finansowe, zdrowotne, społeczne) albo gdy od jego działania zależy powodzenie dużego przedsięwzięcia biznesowego czy na przykład sprawne funkcjonowanie szpitala.

W tej książce znajdziesz omówienie dwunastu najbardziej typowych błędów programistycznych, wystawiających serwis internetowy na ataki hakerów. W każdym rozdziale prezentowana jest inna klasa błędów – na przykładach pochodzących z realnych, działających w sieci aplikacji — wraz ze sposobami zaradzenia tym błędom na etapie projektowania lub poprawiania strony WWW. Znajdziesz tu opis kwestii dotyczących kontroli dostępu do danych, wstrzykiwania kodu, przechowywania haseł użytkowników, właściwej autoryzacji, błędów transakcyjnych. Dowiesz się, jak zabezpieczać serwis przed atakami na sesję i na logowanie, atakami XSS czy Path Traversal. Jeśli tylko znasz PHP, MySQL, HTML i CSS w stopniu pozwalającym zaprojektować serwis internetowy, ta książka może uchronić Cię przed wieloma przykrymi niespodziankami…

Zabezpiecz serwis i śpij spokojnie!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Redaktor prowadzący: Ewelina Burska Projekt okładki: Studio Gravite/Olsztyn Obarek, Pokoński, Pazdrijowski, Zaprucki Materiały graficzne na okładce zostały wykorzystane za zgodą Shutterstock. Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/twbeap Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Kody wykorzystane w książce można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/twbeap.zip ISBN: 978-83-246-8131-0 Copyright © Helion 2014 Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis tre(cid:264)ci Wst(cid:246)p .............................................................................................. 5 Rozdzia(cid:228) 1. Kontrola dost(cid:246)pu do danych i funkcji ................................................ 7 Modyfikacje elementów interfejsu ................................................................................... 7 Zabezpieczanie dost(cid:266)pu do danych ................................................................................. 13 Kwestia enumeracji zasobów ......................................................................................... 15 Kontrola dost(cid:266)pu do funkcji ........................................................................................... 18 Modyfikowanie (cid:298)(cid:261)da(cid:276) HTTP ......................................................................................... 22 Rozdzia(cid:228) 2. SQL Injection ................................................................................. 27 Co to jest SQL Injection? ............................................................................................... 27 Atak na logowanie .......................................................................................................... 27 Dost(cid:266)p do ukrytych danych ............................................................................................ 34 Nieautoryzowane modyfikowanie danych ...................................................................... 39 (cid:285)lepy atak (Blind SQL Injection) ................................................................................... 40 Ataki specyficzne dla platformy ..................................................................................... 44 Sposoby obrony .............................................................................................................. 47 Filtry i (cid:286)cis(cid:225)e typowanie ........................................................................................... 48 Bia(cid:225)e i czarne listy .................................................................................................... 49 Eskejpowanie ........................................................................................................... 50 Zapytania parametryzowane ..................................................................................... 51 Odpowiednie uprawnienia ........................................................................................ 54 Automatyczne wyszukiwanie b(cid:225)(cid:266)dów ............................................................................. 54 Rozdzia(cid:228) 3. Przechowywanie hase(cid:228) u(cid:276)ytkowników .............................................. 59 Has(cid:225)a niekodowane ......................................................................................................... 59 Szyfrowanie symetryczne ............................................................................................... 62 Korzystanie z funkcji skrótu ........................................................................................... 64 Solenie hase(cid:225) ................................................................................................................... 65 Rozdzia(cid:228) 4. Ataki na logowanie ........................................................................ 71 Przesy(cid:225)anie danych ......................................................................................................... 71 Blokowanie kont ............................................................................................................. 72 Opó(cid:296)nianie prób logowania ............................................................................................ 77 Logowanie i CAPTCHA ................................................................................................ 80 Informacje dla u(cid:298)ytkownika ........................................................................................... 85 (cid:224)(cid:261)czenie ró(cid:298)nych metod ................................................................................................. 88 Kup książkęPoleć książkę 4 Tworzenie bezpiecznych aplikacji internetowych (z przyk(cid:228)adami w PHP) Rozdzia(cid:228) 5. Ataki typu XSS ............................................................................... 89 Czym jest Cross-site scripting? ...................................................................................... 89 Jak powstaje b(cid:225)(cid:261)d typu XSS? .......................................................................................... 89 Skutki ataku typu Persistent XSS ................................................................................... 94 Atak typu Reflected XSS ................................................................................................ 97 Sposoby obrony ............................................................................................................ 100 Rozdzia(cid:228) 6. Dane z zewn(cid:246)trznych (cid:274)róde(cid:228) .......................................................... 105 Gad(cid:298)ety na stronach WWW ......................................................................................... 105 Rozdzia(cid:228) 7. Ataki CSRF i b(cid:228)(cid:246)dy transakcyjne ................................................... 115 Geneza ataku ................................................................................................................ 115 Przyk(cid:225)ad serwisu podatnego na atak ............................................................................. 115 B(cid:225)(cid:266)dy transakcyjne ....................................................................................................... 120 Atak CSRF ................................................................................................................... 124 Tokeny jako ochrona przed CSRF ................................................................................ 128 Rozdzia(cid:228) 8. Ataki Path Traversal ..................................................................... 133 Specyfika ataku ............................................................................................................ 133 Serwis pobierania plików podatny na atak ................................................................... 133 Identyfikatory zamiast nazw plików ............................................................................. 138 Nie tylko pobieranie plików ......................................................................................... 141 Rozdzia(cid:228) 9. Brak w(cid:228)a(cid:264)ciwej autoryzacji ........................................................... 147 Uwierzytelnienie i autoryzacja ..................................................................................... 147 Uwierzytelnienie to nie wszystko ................................................................................. 147 Autoryzacja wykonywanych operacji ........................................................................... 152 Rozdzia(cid:228) 10. Dane u klienta ............................................................................. 161 Logowanie raz jeszcze .................................................................................................. 161 Dane uwierzytelniaj(cid:261)ce w cookie ................................................................................. 165 Koszyk w sklepie internetowym ................................................................................... 168 Rozdzia(cid:228) 11. Ataki na sesj(cid:246) ............................................................................. 181 Porywanie sesji ............................................................................................................. 181 Fiksacja i adopcja ......................................................................................................... 182 Przyk(cid:225)ad strony podatnej na z(cid:225)o(cid:298)ony atak .................................................................... 183 Rozdzia(cid:228) 12. (cid:227)adowanie plików na serwer ......................................................... 191 Serwis z obrazami ......................................................................................................... 191 Czy to dzia(cid:225)a? ............................................................................................................... 197 Atak na aplikacj(cid:266) .......................................................................................................... 198 Jak poprawi(cid:252) aplikacj(cid:266)? ................................................................................................ 202 Skorowidz .................................................................................... 205 Kup książkęPoleć książkę Rozdzia(cid:228) 1. Kontrola dost(cid:246)pu do danych i funkcji Modyfikacje elementów interfejsu Pierwszy rozdzia(cid:225), na rozgrzewk(cid:266), jest po(cid:286)wi(cid:266)cony — wydawa(cid:225)oby si(cid:266) — prostym b(cid:225)(cid:266)dom zwi(cid:261)zanym z brakiem kontroli dost(cid:266)pu do danych i funkcji. Typowym przy- k(cid:225)adem jest poleganie na mechanizmach zaimplementowanych w interfejsie u(cid:298)yt- kownika aplikacji dzia(cid:225)aj(cid:261)cej po stronie klienta i pomini(cid:266)cie weryfikacji po stronie serwera. Najcz(cid:266)(cid:286)ciej jest to spotykane w aplikacjach desktopowych, gdzie nieco trud- niej zmodyfikowa(cid:252) kod klienta (co wcale nie znaczy, (cid:298)e jest to bardzo skomplikowa- ne), ale dotyczy to te(cid:298) wielu aplikacji webowych. Rozwa(cid:298)my najprostszy i najbardziej ewidentny przyk(cid:225)ad, w którym kontrola dost(cid:266)pu do danych odbywa si(cid:266) przez wy(cid:225)(cid:261)czenie cz(cid:266)(cid:286)ci elementów interfejsu graficznego. Przyjmijmy, (cid:298)e powsta(cid:225) portal, w którym dost(cid:266)pna jest lista wiadomo(cid:286)ci (oczywi(cid:286)cie w praktyce mog(cid:261) to by(cid:252) dowolne inne zasoby). Cz(cid:266)(cid:286)(cid:252) z nich ma by(cid:252) przeznaczona tylko dla zalogowanych u(cid:298)ytkowników, ale tytu(cid:225)y wszystkich wiadomo(cid:286)ci maj(cid:261) by(cid:252) wy(cid:286)wietlane zawsze. Tego typu zadanie realizuje si(cid:266) poprzez wy(cid:225)(cid:261)czenie cz(cid:266)(cid:286)ci ele- mentów interfejsu graficznego. Tytu(cid:225)y niedost(cid:266)pne dla niezalogowanych go(cid:286)ci s(cid:261) wy- (cid:286)wietlane jako zwyk(cid:225)y tekst, nieaktywne elementy list rozwijanych itp. Strona mo(cid:298)e wi(cid:266)c wygl(cid:261)da(cid:252) tak jak na rysunku 1.1. Wiadomo(cid:286)ci dla wszystkich s(cid:261) wy(cid:286)wietlane jako aktywne elementy listy, a wiadomo(cid:286)ci dla zalogowanych jako elementy nieaktywne. Programista cz(cid:266)sto zak(cid:225)ada, (cid:298)e wy(cid:225)(cid:261)czenie elementu interfejsu jest wystarczaj(cid:261)ce, aby zablokowa(cid:252) dost(cid:266)p osobom niepowo(cid:225)anym, co oczywi(cid:286)cie jest b(cid:225)(cid:266)dem. Wbrew pozo- rom problemy tego typu wcale nie dotycz(cid:261) tylko niedo(cid:286)wiadczonych deweloperów. To jeden z powtarzaj(cid:261)cych si(cid:266) b(cid:225)(cid:266)dów, stale zajmuj(cid:261)cy czo(cid:225)owe miejsca na listach najcz(cid:266)(cid:286)ciej spotykanych luk w zabezpieczeniach. O ile pocz(cid:261)tkuj(cid:261)cy programi(cid:286)ci po- pe(cid:225)niaj(cid:261) go z niewiedzy, o tyle ci do(cid:286)wiadczeni zwykle z powodu przeoczenia. Kup książkęPoleć książkę 8 Tworzenie bezpiecznych aplikacji internetowych (z przyk(cid:228)adami w PHP) Rysunek 1.1. Widok witryny w list(cid:261) tytu(cid:225)ów wiadomo(cid:286)ci W tym przypadku usterka wydaje si(cid:266) oczywista. To jednak tylko prosta ilustracja problemu, który mo(cid:298)e si(cid:266) pojawia(cid:252) w ró(cid:298)nych wariantach. Fragment generuj(cid:261)cy list(cid:266) widomo(cid:286)ci mia(cid:225)by w tym przypadku zapewne kod podobny do przedstawionego na li- stingu 1.1 (pe(cid:225)ny kod przyk(cid:225)adu znajduje si(cid:266) w podkatalogu r01examp01a). Listing 1.1. Kod generuj(cid:261)cy list(cid:266) wiadomo(cid:286)ci form action= index.php method= get select size= 6 name= id ?php foreach($msgs as $msg): if(!isset($_SESSION[ zalogowany ]) $msg[ registered ]){ $disabledstr = disabled= disabled ; } else{ $disabledstr = ; } ? option value= ?php echo $msg[ id ]? ?php echo $disabledstr; ? ?php echo $msg[ title ]? /option ?php endforeach; ? /select input type= hidden name= action value= showmsg input type= submit value= Sprawd(cid:316) wiadomo(cid:295)(cid:232) /form Jest to kod szablonu, do którego zosta(cid:225)a przekazana lista wiadomo(cid:286)ci (np. pobrana z bazy danych) w postaci tablicy $msgs. Ka(cid:298)dy element tej tablicy jest osobn(cid:261) tablic(cid:261) asocja- cyjn(cid:261) zawieraj(cid:261)c(cid:261) klucze wskazuj(cid:261)ce identyfikator (id), tytu(cid:225) (title), tre(cid:286)(cid:252) (body) oraz informacj(cid:266), czy wiadomo(cid:286)(cid:252) jest przeznaczona tylko dla zalogowanych u(cid:298)ytkow- ników (registered). To, czy u(cid:298)ytkownik jest zalogowany, czy te(cid:298) nie, jest wskazy- wane przez zmienn(cid:261) sesji o nazwie zalogowany. A zatem gdy warunek isset($_SESSION[ zalogowany ]) jest nieprawdziwy (u(cid:298)ytkownik niezalogowany) oraz warto(cid:286)(cid:252) klucza registered jest interpretowana jako true (wiado- Kup książkęPoleć książkę Rozdzia(cid:228) 1. (cid:105) Kontrola dost(cid:246)pu do danych i funkcji 9 mo(cid:286)(cid:252) tylko dla zalogowanych), w zmiennej $disabledstr zapisywany jest ci(cid:261)g wy(cid:225)(cid:261)- czaj(cid:261)cy dany element listy (disabled= disabled ); w przeciwnym przypadku zmienna ta otrzymuje pusty ci(cid:261)g znaków. Powstan(cid:261) wi(cid:266)c opcje w dwóch wersjach. Pierwsza w postaci: option value= identyfikator tytu(cid:273) wiadomo(cid:295)ci /option i druga w postaci: option value= identyfikator disabled= disabled tytu(cid:273) wiadomo(cid:295)ci /option Przygl(cid:261)daj(cid:261)c si(cid:266) znacznikom tworz(cid:261)cym formularz, mo(cid:298)na (cid:225)atwo stwierdzi(cid:252), (cid:298)e aby uzyska(cid:252) tre(cid:286)(cid:252) wiadomo(cid:286)ci, skryptowi index.php (action= index.php ) nale(cid:298)y za po- moc(cid:261) metody GET (method= get ) przekaza(cid:252) parametr action o warto(cid:286)ci showmsg (pole input typu hidden z atrybutem name o warto(cid:286)ci action i atrybutem value o warto(cid:286)ci showmsg) i parametr id (warto(cid:286)(cid:252) atrybutu name znacznika select ) wskazuj(cid:261)cy iden- tyfikator wiadomo(cid:286)ci. W kodzie (cid:296)ród(cid:225)owym HTML takiej witryny znajdziemy zatem fragment podobny do widocznego na listingu 1.2. Listing 1.2. Fragment strony generowanej przez kod PHP select size= 6 name= id option value= 1 Wiadomo(cid:295)(cid:232) dla wszystkich /option option value= 2 disabled= disabled Wiadomo(cid:295)(cid:232) tylko dla zalogowanych /option option value= 3 disabled= disabled Wiadomo(cid:295)(cid:232) równie(cid:318) tylko dla (cid:180)zalogowanych /option option value= 4 Inna wiadomo(cid:295)(cid:232) dla wszystkich /option option value= 5 Kolejna wiadomo(cid:295)(cid:232) dla wszystkich /option /select Wy(cid:286)wietlanie pojedynczych wiadomo(cid:286)ci mo(cid:298)e by(cid:252) realizowane w osobnym szablonie przez fragment kodu przedstawiony na listingu 1.3. Szablon otrzymuje tablic(cid:266) $msg (o kluczach opisanych wy(cid:298)ej) zawieraj(cid:261)c(cid:261) dane dotycz(cid:261)ce wiadomo(cid:286)ci. Je(cid:298)eli zmienna $msg nie jest pusta, wy(cid:286)wietlane s(cid:261) tytu(cid:225) (dane znajduj(cid:261)ce si(cid:266) pod kluczem title) oraz tre(cid:286)(cid:252) (dane znajduj(cid:261)ce si(cid:266) pod kluczem body). W przeciwnym przypadku wy(cid:286)wietlany jest tekst z informacj(cid:261) o braku wiadomo(cid:286)ci (tekst „Nie ma nic do wy(cid:286)wietlenia.”). Listing 1.3. Fragment szablonu wy(cid:286)wietlaj(cid:261)cego tre(cid:286)(cid:252) wiadomo(cid:286)ci div ?php if($msg): echo $msg[ title ]; echo br / ; echo $msg[ body ]; else: echo Nie ma nic do wy(cid:295)wietlenia. ; endif; ? /div Kup książkęPoleć książkę 10 Tworzenie bezpiecznych aplikacji internetowych (z przyk(cid:228)adami w PHP) Za przygotowanie wiadomo(cid:286)ci do wy(cid:286)wietlenia (dane dla zmiennej $msg) mo(cid:298)e od- powiada(cid:252) funkcja showMsg przedstawiona na listingu 1.4. To ona jest w tym przyk(cid:225)a- dzie kluczowa. W zaprezentowanej postaci sprawdzane jest, czy za pomoc(cid:261) metody GET zosta(cid:225) przekazany parametr o nazwie id (czy w tablicy $_GET znajduje si(cid:266) klucz o nazwie id), a je(cid:286)li tak, do zmiennej $msg trafia rezultat wywo(cid:225)ania metody pobiera- j(cid:261)cej wiadomo(cid:286)(cid:252) (metoda getMsg), której przekazywana jest warto(cid:286)(cid:252) odczytana z ta- blicy $_GET (czyli warto(cid:286)(cid:252) otrzymanego parametru). Listing 1.4. Funkcja odpowiedzialna za wy(cid:286)wietlenie wiadomo(cid:286)ci function showMsg() { $msg = null; if(isset($_GET[ id ])){ $msg = $this- getMsg($_GET[ id ]); } include tmpl/msg.tpl ; } Tak przygotowany kod portalu zawiera rzecz jasna podstawowy b(cid:225)(cid:261)d, który w tym przypadku wydaje si(cid:266) wr(cid:266)cz oczywisty. Owszem, wy(cid:225)(cid:261)czenie cz(cid:266)(cid:286)ci elementów listy b(cid:266)- dzie skutecznym zabezpieczeniem w przypadku 80 – 90 typowych u(cid:298)ytkowników internetu, ale tak naprawd(cid:266) nie jest (cid:298)adnym zabezpieczeniem. Wystarczy samodziel- nie utworzy(cid:252) odno(cid:286)nik do skryptu index.php wraz z opisanymi wy(cid:298)ej parametrami, aby uzyska(cid:252) dost(cid:266)p do wiadomo(cid:286)ci, np.: http://nazwa.domeny/index.php?id=2 action=showmsg Poszczególne identyfikatory wiadomo(cid:286)ci s(cid:261) przecie(cid:298) wyra(cid:296)nie widoczne w kodzie HTML wys(cid:225)anym do przegl(cid:261)darki (wyró(cid:298)nione fragmenty na listingu 1.2). Poniewa(cid:298) ani w funkcji showMsg (z listingu 1.4), ani w (cid:298)adnym innym miejscu kodu serwisu nie wyst(cid:266)puje weryfikacja uprawnie(cid:276) u(cid:298)ytkownika, wiadomo(cid:286)(cid:252) zostanie pokazana ka(cid:298)- demu, kto u(cid:298)yje opisanego odno(cid:286)nika, niezale(cid:298)nie od tego, czy jest zalogowany, czy te(cid:298) nie. W sieci mo(cid:298)na napotka(cid:252) informacje, (cid:298)e w tego typu sytuacji lepiej zamiast metody GET u(cid:298)y(cid:252) metody POST, gdy(cid:298) dane nie s(cid:261) wtedy do(cid:225)(cid:261)czane do adresu URL i ich nie wi- da(cid:252), a poza tym nie da si(cid:266) (cid:225)atwo przygotowa(cid:252) (cid:298)(cid:261)dania typu POST (zmodyfikowane pli- ki s(cid:261) dost(cid:266)pne w katalogu r01examp01b). W kodzie formularza z listingu 1.1 mia(cid:225)aby si(cid:266) wi(cid:266)c zmieni(cid:252) warto(cid:286)(cid:252) atrybutu method: form action= index.php method= post a w kodzie funkcji z listingu 1.4 pojawi(cid:225)yby si(cid:266) odwo(cid:225)ania do $_POST: if(isset($_POST[ id ])){ $msg = $this- getMsg($_POST[ id ]); Oczywi(cid:286)cie taki pomys(cid:225) nie ma wi(cid:266)kszego sensu. Po pierwsze, wcale nie trzeba sa- modzielnie tworzy(cid:252) (cid:298)(cid:261)dania typu POST. W przegl(cid:261)darce mo(cid:298)na przecie(cid:298) dowolnie mo- dyfikowa(cid:252) otrzymany kod HTML, a wi(cid:266)c i bez najmniejszych problemów da si(cid:266) od- blokowa(cid:252) nieaktywne elementy listy. Kup książkęPoleć książkę Rozdzia(cid:228) 1. (cid:105) Kontrola dost(cid:246)pu do danych i funkcji 11 Wystarczy w(cid:225)(cid:261)czy(cid:252) narz(cid:266)dzia deweloperskie dost(cid:266)pne standardowo ju(cid:298) w prawie ka(cid:298)dym produkcie i zmodyfikowa(cid:252) (cid:298)(cid:261)dany fragment kodu HTML. W tym przypadku wystar- czy(cid:225)oby usun(cid:261)(cid:252) atrybut disabled z elementu listy, który chcemy uaktywni(cid:252) (rysunek 1.2). Wtedy tytu(cid:225) danej wiadomo(cid:286)ci stanie si(cid:266) aktywny (rysunek 1.3) i b(cid:266)dzie mo(cid:298)na u(cid:298)y(cid:252) przycisku wy(cid:286)wietlaj(cid:261)cego wiadomo(cid:286)ci. Narz(cid:246)dzia deweloperskie Obecnie praktycznie w ka(cid:276)dej wspó(cid:228)czesnej przegl(cid:241)darce dost(cid:246)pne s(cid:241) narz(cid:246)dzia dewelo- perskie, które pozwalaj(cid:241) kontrolowa(cid:232) wi(cid:246)kszo(cid:264)(cid:232) aspektów technicznych zwi(cid:241)zanych z witry- n(cid:241), w tym bezpo(cid:264)rednio wp(cid:228)ywa(cid:232) na zawarto(cid:264)(cid:232) strony. W przegl(cid:241)darkach Chrome i Internet Explorer obecne s(cid:241) standardowo i mo(cid:276)na je wywo(cid:228)a(cid:232), wciskaj(cid:241)c klawisz F12 lub wybieraj(cid:241)c z menu podr(cid:246)cznego (pozycja menu Zbadaj element lub o podobnej nazwie). W Firefoksie najlepiej zainstalowa(cid:232) rozszerzenie Firebug. Rysunek 1.2. Ingerencja w kod (cid:296)ród(cid:225)owy strony Rysunek 1.3. Odblokowany element interfejsu Po drugie, metoda POST nie jest (cid:298)adnym zabezpieczeniem, a dane nie s(cid:261) nigdzie ukry- wane, ale przesy(cid:225)ane w nag(cid:225)ówkach (cid:298)(cid:261)dania HTTP. Mo(cid:298)na je bez problemów obej- rze(cid:252), korzystaj(cid:261)c z narz(cid:266)dzi deweloperskich lub te(cid:298) z dodatkowych wtyczek do prze- gl(cid:261)darek (np. Live HTTP Headers dla Firefoksa). W przypadku przegl(cid:261)darki Chrome wystarczy wykona(cid:252) (cid:298)(cid:261)danie (wskaza(cid:252) na stronie jedn(cid:261) z wiadomo(cid:286)ci i klikn(cid:261)(cid:252) przycisk Sprawd(cid:296) wiadomo(cid:286)(cid:252)), wcisn(cid:261)(cid:252) klawisz F12, przej(cid:286)(cid:252) na zak(cid:225)adk(cid:266) Network, a nast(cid:266)pnie Kup książkęPoleć książkę 12 Tworzenie bezpiecznych aplikacji internetowych (z przyk(cid:228)adami w PHP) w kolumnie Name wskaza(cid:252) URL (cid:298)(cid:261)dania (index.php). W panelu po prawej stronie poja- wi(cid:261) si(cid:266) wszelkie informacje dotycz(cid:261)ce (cid:298)(cid:261)dania oraz odpowiedzi serwera. Widoczne wi(cid:266)c b(cid:266)d(cid:261) te(cid:298) parametry przekazane do serwera za pomoc(cid:261) metody POST (rysunek 1.4). Rysunek 1.4. Podgl(cid:261)danie nag(cid:225)ówków HTTP w przegl(cid:261)darce Chrome Po trzecie, konstrukcja (cid:298)(cid:261)dania typu POST jest prosta. W bardziej skomplikowanych przy- padkach mo(cid:298)na u(cid:298)y(cid:252) np. skryptu PHP, ale najprostszym rozwi(cid:261)zaniem jest stworzenie w(cid:225)asnego formularza z odpowiednimi parametrami. Mo(cid:298)na go przygotowa(cid:252) nawet na kilka sposobów. Wiadomo przecie(cid:298), jakie parametry maj(cid:261) by(cid:252) przes(cid:225)ane, wi(cid:266)c istniej(cid:261) ró(cid:298)ne mo(cid:298)liwo(cid:286)ci ich przekazania. Aby dosta(cid:252) si(cid:266) do wiadomo(cid:286)ci numer 2, taki for- mularz móg(cid:225)by mie(cid:252) posta(cid:252) przedstawion(cid:261) na listingu 1.5. Listing 1.5. Formularz pozwalaj(cid:261)cy na skorzystanie z metody POST form action= http://nazwa.domeny/r01examp01b/index.php method= post input type= text name= id value= 2 input type= hidden name= action value= showmsg input type= submit value= Sprawd(cid:316) wiadomo(cid:295)(cid:232) class= btn /form Po czwarte, metody GET i POST nie s(cid:261) przeznaczone do zamiennego stosowania. Pierw- szej z nich u(cid:298)ywa si(cid:266) do zada(cid:276), które nie modyfikuj(cid:261) stanu serwera, natomiast drugiej — wr(cid:266)cz odwrotnie — do zada(cid:276), które modyfikuj(cid:261) jego stan (np. zmiana danych)1. Metody POST nie nale(cid:298)y zatem stosowa(cid:252) w przypadku zwyk(cid:225)ego wy(cid:286)wietlania infor- macji, zw(cid:225)aszcza (cid:298)e próba od(cid:286)wie(cid:298)enia strony za ka(cid:298)dym razem b(cid:266)dzie skutkowa(cid:225)a wy(cid:286)wietleniem u(cid:298)ytkownikowi komunikatu z pro(cid:286)b(cid:261) o potwierdzenie ch(cid:266)ci wykona- nia operacji, podobnego do przedstawionego na rysunku 1.5. 1 Nie jest to w pe(cid:225)ni (cid:286)cis(cid:225)a definicja. Metoda GET powinna by(cid:252) stosowana do wywo(cid:225)a(cid:276) idempotentnych, czyli takich, których wielokrotne wywo(cid:225)anie daje taki sam efekt, a metoda POST — do wywo(cid:225)a(cid:276) nieidempotentnych. Wi(cid:266)cej informacji znajduje si(cid:266) w dokumentach opisuj(cid:261)cych protokó(cid:225) HTTP. Kup książkęPoleć książkę Rozdzia(cid:228) 1. (cid:105) Kontrola dost(cid:246)pu do danych i funkcji 13 Rysunek 1.5. Pro(cid:286)ba o potwierdzenie ch(cid:266)ci ponownego wykonania operacji Zabezpieczanie dost(cid:246)pu do danych Skoro kod omawiany w pierwszym rozdziale zawiera b(cid:225)(cid:266)dy, trzeba je poprawi(cid:252). Mo(cid:298)na w nim dostrzec co najmniej trzy nieprawid(cid:225)owo(cid:286)ci. Rzecz pierwsza to ujawnianie zbyt wielu informacji, co wynika z zastosowania jednolitego schematu generowania elementów interfejsu. Skoro bowiem niezalogowany u(cid:298)ytkownik nie powinien mie(cid:252) dost(cid:266)pu do cz(cid:266)(cid:286)ci wiadomo(cid:286)ci, to nie ma te(cid:298) potrzeby, aby ujawnia(cid:252) w kodzie wszystkie identyfikatory. Tak(cid:261) zasad(cid:266) nale(cid:298)y przyj(cid:261)(cid:252) jako wskazówk(cid:266) ogóln(cid:261) — zawsze przekazujemy na zewn(cid:261)trz tylko tyle informacji, ile jest faktycznie niezb(cid:266)dne. W tym konkretnym przypadku mo(cid:298)na ca(cid:225)kowicie pomin(cid:261)(cid:252) atrybut value znacznika option dla wiadomo(cid:286)ci nieaktywnych lub te(cid:298) zastosowa(cid:252) pewn(cid:261) warto(cid:286)(cid:252) specjaln(cid:261), np. –1. Fragment kodu generuj(cid:261)cego list(cid:266) wiadomo(cid:286)ci móg(cid:225)by wi(cid:266)c przyj(cid:261)(cid:252) posta(cid:252) przedstawion(cid:261) na listingu 1.6. Listing 1.6. Zastosowanie warto(cid:286)ci specjalnej dla cz(cid:266)(cid:286)ci opcji select size= 6 name= id ?php foreach($msgs as $msg): if(!isset($_SESSION[ zalogowany ]) $msg[ registered ]){ $disabledstr = disabled= disabled ; $id = -1 ; } else{ $disabledstr = ; $id = $msg[ id ]; } ? option value= ?php echo $id; ? ?php echo $disabledstr; ? ?php echo $msg[ title ]? /option ?php endforeach; ? /select Po takiej zmianie wynikowy kod HTML listy przyjmie posta(cid:252) widoczn(cid:261) na rysunku 1.6. Wszystkie znaczniki option odpowiadaj(cid:261)ce wiadomo(cid:286)ciom niedost(cid:266)pnym dla nie- zalogowanych u(cid:298)ytkowników otrzyma(cid:225)y atrybut value o warto(cid:286)ci –1. Ich identyfikatory nie zostan(cid:261) zatem przekazane. Oczywi(cid:286)cie to nie jest jeszcze zabezpieczenie, ale dobra praktyka, aby nie ujawnia(cid:252) zbyt wielu informacji. W tym przypadku mo(cid:298)na si(cid:266) te(cid:298) (cid:225)atwo domy(cid:286)li(cid:252), (cid:298)e brakuj(cid:261)ce identyfikatory to prawdopodobnie 3 i 4. W praktyce, rzecz jasna, zapewne nie b(cid:266)d(cid:261) one kolejnymi liczbami i nie b(cid:266)dzie to ju(cid:298) tak proste do stwierdze- nia (ten problem b(cid:266)dzie poruszony w podrozdziale „Kwestia enumeracji zasobów”). Kup książkęPoleć książkę 14 Tworzenie bezpiecznych aplikacji internetowych (z przyk(cid:228)adami w PHP) Rysunek 1.6. Wynikowy kod HTML generowany przez skrypt z listingu 1.6 Jednak podstawowym b(cid:225)(cid:266)dem w dotychczasowym kodzie by(cid:225) brak weryfikacji uprawnie(cid:276) przy wy(cid:286)wietlaniu wiadomo(cid:286)ci. Nale(cid:298)a(cid:225)oby wi(cid:266)c poprawi(cid:252) kod z listingu 1.3, tak aby wiadomo(cid:286)(cid:252) z ustawion(cid:261) flag(cid:261) registered (klucz registered w tablicy $msg) by(cid:225)a wy- (cid:286)wietlana tylko wtedy, gdy jednocze(cid:286)nie ustawiona jest zmienna sesji zalogowany. Tak(cid:261) poprawk(cid:266) mo(cid:298)na wprowadzi(cid:252) w sposób przedstawiony na listingu 1.7. Listing 1.7. Sprawdzanie uprawnie(cid:276) do wy(cid:286)wietlania wiadomo(cid:286)ci ?php if($msg): if(!$msg[ registered ] || ($msg[ registered ] isset($_SESSION[ zalogowany ]))): echo $msg[ title ]; echo br / ; echo $msg[ body ]; else: echo Brak uprawnie(cid:275). ; endif; else: echo Nie ma nic do wy(cid:295)wietlenia. ; endif; ? Tym razem, je(cid:298)eli istnieje wiadomo(cid:286)(cid:252) o wskazanym identyfikatorze (zmienna $msg nie jest pusta), dodatkowo badany jest z(cid:225)o(cid:298)ony warunek stwierdzaj(cid:261)cy, czy mo(cid:298)e by(cid:252) ona po- kazana. Wy(cid:286)wietlona b(cid:266)dzie tylko wtedy, gdy nie ma statusu registered lub te(cid:298) gdy ma status registered, ale u(cid:298)ytkownik jest zalogowany (istnieje zmienna sesji zalogowany). Trzeci ze wspomnianych b(cid:225)(cid:266)dów jest równie(cid:298) zwi(cid:261)zany z funkcj(cid:261) showMsg. Nale(cid:298)y zwróci(cid:252) uwag(cid:266), (cid:298)e warto(cid:286)(cid:252) odczytana z indeksu id tablicy $_GET jest przekazywana bez- po(cid:286)rednio do funkcji pobieraj(cid:261)cej wskazan(cid:261) wiadomo(cid:286)(cid:252). W tym konkretnym przy- padku nie stanowi to du(cid:298)ego zagro(cid:298)enia, ale jest to bardzo z(cid:225)a praktyka. Wszelkie da- ne otrzymywane z zewn(cid:261)trz zawsze nale(cid:298)y traktowa(cid:252) jako niezaufane i weryfikowa(cid:252) ich poprawno(cid:286)(cid:252). Nigdy nie mo(cid:298)na zak(cid:225)ada(cid:252), (cid:298)e pochodz(cid:261) one z „naszego” formularza, bo te(cid:298) nigdy nie wiadomo, kto i co nam przys(cid:225)a(cid:225). Mo(cid:298)na u(cid:298)y(cid:252) jednej z funkcji filtruj(cid:261)- cych (np. filter_input), a je(cid:286)li wiadomo, (cid:298)e spodziewana jest warto(cid:286)(cid:252) ca(cid:225)kowita (jak w omawianym przyk(cid:225)adzie), tak(cid:298)e zwyk(cid:225)ej konwersji na typ int (warto te(cid:298) si(cid:266) zasta- nowi(cid:252), czy nie b(cid:266)dzie przydatne ograniczenie dopuszczalnego zakresu warto(cid:286)ci). Dodatkowo ze wzgl(cid:266)du na zmiany wprowadzone w szablonie generuj(cid:261)cym list(cid:266) i ko- nieczno(cid:286)(cid:252) obs(cid:225)ugi warto(cid:286)ci –1, wskazuj(cid:261)cej, (cid:298)e wiadomo(cid:286)(cid:252) nie powinna by(cid:252) pokazy- wana, warto sprawdza(cid:252) stan parametru id. Kup książkęPoleć książkę Rozdzia(cid:228) 1. (cid:105) Kontrola dost(cid:246)pu do danych i funkcji 15 Kod funkcji showMsg mo(cid:298)na wi(cid:266)c zmieni(cid:252) w sposób przedstawiony na listingu 1.8 (pe(cid:225)ny kod przyk(cid:225)adu znajduje si(cid:266) w podkatalogu r01examp01c). Listing 1.8. Poprawiona wersja funkcji showMsg function showMsg() { $msg = null; if(isset($_GET[ id ])){ $id = intval($_GET[ id ]); //lub //$id = filter_input(INPUT_GET, id , FILTER_VALIDATE_INT); if($id 0){ $msg = $this- getMsg($id); } } include tmpl/msg.tpl ; } Po sprawdzeniu, (cid:298)e do skryptu za pomoc(cid:261) metody GET zosta(cid:225) przekazany parametr o na- zwie id, jego warto(cid:286)(cid:252) jest konwertowana na typ ca(cid:225)kowitoliczbowy i przypisywana po- mocniczej zmiennej $id. Metoda getMsg, pobieraj(cid:261)ca tre(cid:286)(cid:252) wiadomo(cid:286)ci, jest wywo(cid:225)ywana tylko wtedy, gdy warto(cid:286)(cid:252) zapisana w $id jest wi(cid:266)ksza od 0. W przeciwnym przypadku (co oznacza nieprawid(cid:225)ow(cid:261) warto(cid:286)(cid:252) parametru) zmienna $msg pozostaje pusta. Gdzie sprawdza(cid:232) uprawnienia? Prezentowany przyk(cid:228)adowy kod jest uproszczony i weryfikacja uprawnie(cid:254) odbywa si(cid:246) w szablonie wy(cid:264)wietlaj(cid:241)cym dane. Takie rozwi(cid:241)zania s(cid:241) co prawda stosowane, jednak w praktyce zasadne by(cid:228)oby przeniesienie podejmowania decyzji o wy(cid:264)wietlaniu do logiki aplikacji — w tym przy- padku zapewne do funkcji showMsg. Komunikat o braku uprawnie(cid:254) móg(cid:228)by by(cid:232) wtedy wy- (cid:264)wietlany w osobnej strukturze przeznaczonej dla wiadomo(cid:264)ci systemowych. Kwestia enumeracji zasobów Jak wspomniano w poprzednim podrozdziale przy omawianiu przyk(cid:225)adu z listingu 1.6, samo ukrycie identyfikatorów zasobów (w tym przypadku — wiadomo(cid:286)ci) nie stano- wi (cid:298)adnego zabezpieczenia przed atakiem. Je(cid:286)li nie zostanie wprowadzona weryfikacja uprawnie(cid:276), jak zosta(cid:225)o to pokazane na listingach 1.7 i 1.8, ukryte informacje zawsze b(cid:266)dzie mo(cid:298)na odczyta(cid:252). Oczywi(cid:286)cie atakuj(cid:261)cy rzadko kiedy b(cid:266)dzie mia(cid:225) tak komfor- tow(cid:261) sytuacj(cid:266), (cid:298)e identyfikatory b(cid:266)d(cid:261) mia(cid:225)y kolejne numery, ale nawet ich losowo(cid:286)(cid:252) spowodowa(cid:225)aby jedynie niewielkie utrudnienie. Istnieje jednak prawie stuprocentowa gwarancja, (cid:298)e wcze(cid:286)niej czy pó(cid:296)niej znajdzie si(cid:266) kto(cid:286), kto zechce sprawdzi(cid:252), co te(cid:298) kryje si(cid:266) pod ró(cid:298)nymi identyfikatorami. Za(cid:225)ó(cid:298)my zatem, (cid:298)e ze wzgl(cid:266)du na zmian(cid:266) projektu i przeniesienie weryfikacji upraw- nie(cid:276) z szablonu do logiki aplikacji weryfikacja w szablonie zosta(cid:225)a ju(cid:298) wy(cid:225)(cid:261)czona, ale jeszcze nie zosta(cid:225)a zaimplementowana w innym miejscu. Oczywi(cid:286)cie taki kod nigdy Kup książkęPoleć książkę 16 Tworzenie bezpiecznych aplikacji internetowych (z przyk(cid:228)adami w PHP) nie powinien si(cid:266) znale(cid:296)(cid:252) w (cid:286)rodowisku produkcyjnym, ale przez przeoczenie mog(cid:225)o si(cid:266) tak zdarzy(cid:252)2. U(cid:298)ytkownikom niezalogowanym nie s(cid:261) te(cid:298) pokazywane tytu(cid:225)y wia- domo(cid:286)ci przeznaczonych tylko dla u(cid:298)ytkowników zalogowanych (przyk(cid:225)ad w podka- talogu r01examp01d) lub te(cid:298) s(cid:261) pokazywane, ale bez w(cid:225)a(cid:286)ciwych identyfikatorów (jak w przyk(cid:225)adzie z listingu 1.6). Wystarczy zatem, (cid:298)e jaki(cid:286) u(cid:298)ytkownik zacznie wpisywa(cid:252) w pasku adresowym prze- gl(cid:261)darki adresy URL w postaci: http://nazwa.domeny/index.php?id=liczba action=showmsg i b(cid:266)dzie w stanie dotrze(cid:252) do dowolnej wiadomo(cid:286)ci. Badanie tego typu to enumeracja za- sobów. Oczywi(cid:286)cie r(cid:266)czne sprawdzenie wszystkich mo(cid:298)liwych identyfikatorów by(cid:225)o- by bardzo uci(cid:261)(cid:298)liwe i czasoch(cid:225)onne, zatem kto(cid:286), kto naprawd(cid:266) chcia(cid:225)by uzyska(cid:252) do- st(cid:266)p do wszystkich wiadomo(cid:286)ci, z pewno(cid:286)ci(cid:261) napisa(cid:225)by odpowiedni skrypt. Nie jest to skomplikowane zadanie — wystarczy skorzysta(cid:252) np. z biblioteki cURL. Skrypt „wy- ci(cid:261)gaj(cid:261)cy” wiadomo(cid:286)ci z systemu móg(cid:225)by wygl(cid:261)da(cid:252) tak jak na listingu 1.9. Listing 1.9. Enumeracja wiadomo(cid:286)ci ?php $url = http://localhost/r01examp01d/index.php?action=showmsg id= ; for($i = 1; $i = 100; $i++){ echo Przetwarzanie id = $i\n ; $ch = curl_init($url . $i); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); $str = curl_exec($ch); curl_close($ch); $res = --- Warto(cid:295)(cid:232) $i ---\n ; if(preg_match( / div id=\ mainpart\ .*? (.*?) \/div /s , $str, $matches)){ $res .= $matches[1] . \n\n ; } else{ $res .= Brak wzorca.\n\n ; } file_put_contents( msgs.txt , $res, FILE_APPEND); } ? Adres URL serwisu zosta(cid:225) dla wygody zapisany w zmiennej $url znajduj(cid:261)cej si(cid:266) na po- cz(cid:261)tku skryptu. W p(cid:266)tli for generowane s(cid:261) kolejne warto(cid:286)ci parametru id — od 1 do 100. Sesja cURL jest inicjalizowana za pomoc(cid:261) funkcji curl_init, której w postaci argumentu przekazywany jest pe(cid:225)ny adres odwo(cid:225)uj(cid:261)cy si(cid:266) do wiadomo(cid:286)ci o danym identyfikatorze. Adres ten powstaje z po(cid:225)(cid:261)czenia warto(cid:286)ci zmiennej $url z warto(cid:286)ci(cid:261) zmiennej $i. Dzi(cid:266)ki funkcji curl_setopt ustawiane s(cid:261) opcje dodatkowe. Opcja CURLOPT_RETURNTRANSFER usta- wiona na true oznacza, (cid:298)e dane pobrane z sieci maj(cid:261) by(cid:252) zwrócone jako rezultat dzia(cid:225)a- 2 Niestety takie sytuacje naprawd(cid:266) zdarzaj(cid:261) si(cid:266) w praktyce. Kup książkęPoleć książkę Rozdzia(cid:228) 1. (cid:105) Kontrola dost(cid:246)pu do danych i funkcji 17 nia funkcji curl_exec, a CURLOPT_HEADER ustawiona na false okre(cid:286)la, (cid:298)e nie interesuj(cid:261) nas nag(cid:225)ówki protoko(cid:225)u HTTP, ale sama tre(cid:286)(cid:252) pobieranej strony. Po wywo(cid:225)aniu funkcji curl_exec nast(cid:266)puje nawi(cid:261)zanie po(cid:225)(cid:261)czenia z adresem ustawionym w wywo(cid:225)aniu curl_init oraz zwrócenie pobranych danych i zapisanie ich w zmiennej $str. Ta zmienna b(cid:266)dzie wi(cid:266)c zawiera(cid:225)a ci(cid:261)g znaków b(cid:266)d(cid:261)cy odpowiedzi(cid:261) serwera, a wi(cid:266)c tre(cid:286)(cid:252) (cid:296)ród(cid:225)ow(cid:261) strony WWW. Poniewa(cid:298) interesuje nas jedynie cz(cid:266)(cid:286)(cid:252) zawiera- j(cid:261)ca tre(cid:286)(cid:252) wiadomo(cid:286)ci, zosta(cid:225)o u(cid:298)yte wyra(cid:298)enie regularne wraz z funkcj(cid:261) preg_match. Dzi(cid:266)ki temu w zmiennej $matches znajdzie si(cid:266) tablica zawieraj(cid:261)ca fragmenty tekstu „wyci(cid:261)gni(cid:266)te” za pomoc(cid:261) wyra(cid:298)enia ze strony HTML. W drugiej komórce (o indeksie 1) tej tablicy b(cid:266)dzie dost(cid:266)pna tre(cid:286)(cid:252) znajduj(cid:261)ca si(cid:266) mi(cid:266)dzy znacznikiem div z atry- butem id o warto(cid:286)ci mainpart a najbli(cid:298)szym znacznikiem zamykaj(cid:261)cym /div . Wyniki s(cid:261) zapisywane w pliku msgs.txt za pomoc(cid:261) funkcji file_put_contents. Flaga FILE_APPEND wskazuje, (cid:298)e zawarto(cid:286)(cid:252) ma by(cid:252) dopisywana na ko(cid:276)cu pliku, tak aby po- przednia tre(cid:286)(cid:252) nie zosta(cid:225)a skasowana. W rezultacie w pliku wynikowym znajd(cid:261) si(cid:266) in- formacje o tym, dla których identyfikatorów s(cid:261) dost(cid:266)pne wiadomo(cid:286)ci oraz jaka jest ich tre(cid:286)(cid:252) (rysunek 1.7). Wida(cid:252) wyra(cid:296)nie, (cid:298)e tym razem wiadomo(cid:286)ci dla zalogowanych u(cid:298)ytkowników uzyskane ze wzgl(cid:266)du na brak odpowiedniej weryfikacji uprawnie(cid:276) maj(cid:261) identyfikatory 87 i 88. Rysunek 1.7. Fragment zawarto(cid:286)ci pliku z wynikami enumeracji Sam skrypt najlepiej uruchamia(cid:252) w konsoli (wierszu polece(cid:276)) — ze wzgl(cid:266)du na za- stosowanie instrukcji echo mo(cid:298)na b(cid:266)dzie wtedy obserwowa(cid:252) post(cid:266)py jego dzia(cid:225)ania. Warto przy tym zauwa(cid:298)y(cid:252), (cid:298)e w kodzie nie zosta(cid:225)y wprowadzone (cid:298)adne ograniczenia, a wi(cid:266)c program b(cid:266)dzie zu(cid:298)ywa(cid:225) ca(cid:225)e dost(cid:266)pne dla niego zasoby, w tym czas procesora i pasmo (cid:225)(cid:261)cza sieciowego. Problem enumeracji nie ogranicza si(cid:266) tylko do odszukiwania danych, które nie zosta(cid:225)y w odpowiedni sposób zabezpieczone, ale dotyczy wszelkich danych. W typowych sytuacjach ograniczenie liczby (cid:298)(cid:261)da(cid:276), dost(cid:266)pnego pasma, czasu procesora czy pami(cid:266)- ci jest wprowadzane z poziomu firewalla i serwera WWW, u(cid:298)ywane s(cid:261) równie(cid:298) roz- wi(cid:261)zania typu load balancer itp. Na poziomie aplikacji mo(cid:298)na jednak dodatkowo stosowa(cid:252) systemy typu proof-of-work. S(cid:261) one przydatne, gdy na serwerze znajduj(cid:261) si(cid:266) zasoby, których koszt udost(cid:266)pniania jest znacz(cid:261)cy, a my nie chcemy, aby mo(cid:298)na je by(cid:225)o pobiera(cid:252) w sposób nieograniczony Kup książkęPoleć książkę 18 Tworzenie bezpiecznych aplikacji internetowych (z przyk(cid:228)adami w PHP) (jak w przyk(cid:225)adzie z listingu 1.9), ale tak(cid:298)e w takich celach jak np. zapobieganie spa- mowi. Ogólnie rzecz ujmuj(cid:261)c — wsz(cid:266)dzie tam, gdzie wa(cid:298)ne jest, aby serwer móg(cid:225) li- mitowa(cid:252) (cid:298)(cid:261)dania klienta. Wzorzec proof-of-work (dos(cid:225). „udowodnij wykonan(cid:261) prac(cid:266)”) polega na wymuszeniu na kliencie (aplikacji klienta) wykonania zadania wymagaj(cid:261)cego zu(cid:298)ycia stosunkowo du(cid:298)ych zasobów, którego weryfikacja jest wielokrotnie (cid:225)atwiejsza do wykonania i nie wymaga du(cid:298)ych zasobów (jedn(cid:261) z implementacji jest protokó(cid:225) Client Puzzle Protocol). Zadanie (z regu(cid:225)y pewne obliczenie) musi by(cid:252) tak dobrane, (cid:298)eby w przypadku zwy- k(cid:225)ego korzystania z serwisu nie by(cid:225)o zauwa(cid:298)alnym obci(cid:261)(cid:298)eniem dla klienta, natomiast w przypadku próby automatycznego przetwarzania danych — spowodowa(cid:225)o znaczne zu(cid:298)ywanie zasobów. Tym samym potencjalny atakuj(cid:261)cy b(cid:266)dzie musia(cid:225) dysponowa(cid:252) silnym sprz(cid:266)tem (du(cid:298)a liczba procesorów, du(cid:298)a ilo(cid:286)(cid:252) pami(cid:266)ci itp.), co mo(cid:298)e sprawi(cid:252), (cid:298)e atak b(cid:266)dzie nieop(cid:225)acalny. Zatem zamiast typowej obs(cid:225)ugi (cid:298)(cid:261)dania (rysunek 1.8A) interakcja mi(cid:266)dzy klientem a serwerem wygl(cid:261)da wtedy jak na rysunku 1.8B. Klient wysy(cid:225)a najpierw (cid:298)(cid:261)danie pobrania zasobu (1). Nast(cid:266)pnie serwer przydziela zadanie do rozwi(cid:261)zania (2). Klient rozwi(cid:261)- zuje zadanie (w przypadku aplikacji dzia(cid:225)aj(cid:261)cych w przegl(cid:261)darce mo(cid:298)e to by(cid:252) zreali- zowane np. w JavaScripcie) i wysy(cid:225)a je do serwera (3). Serwer weryfikuje odpowied(cid:296) i — gdy jest ona prawid(cid:225)owa — wysy(cid:225)a do klienta pierwotnie (cid:298)(cid:261)dane informacje. Rysunek 1.8. Schemat post(cid:266)powania w systemach proof-of-work Kontrola dost(cid:246)pu do funkcji Kontrola dost(cid:266)pu do funkcji udost(cid:266)pnianych u(cid:298)ytkownikom portalu jest równie wa(cid:298)na jak kontrola dost(cid:266)pu do danych. To analogiczna sytuacja do opisywanych wy(cid:298)ej. Za- (cid:225)ó(cid:298)my, (cid:298)e lista wiadomo(cid:286)ci jest wy(cid:286)wietlana w sposób podobny do pierwszego przy- k(cid:225)adu (listing 1.1 i kolejne, rysunek 1.1), ale nie wyst(cid:266)puje podzia(cid:225) na informacje dla Kup książkęPoleć książkę Rozdzia(cid:228) 1. (cid:105) Kontrola dost(cid:246)pu do danych i funkcji 19 zalogowanych i niezalogowanych. Ka(cid:298)dy mo(cid:298)e zatem przegl(cid:261)da(cid:252) dane. Fragment ko- du odpowiedzialnego za utworzenie listy wiadomo(cid:286)ci móg(cid:225)by wygl(cid:261)da(cid:252) nast(cid:266)puj(cid:261)co: select size= 6 name= id ?php foreach($msgs as $msg):? option value= ?php echo $msg[ id ]; ? ?php echo $msg[ title ]? /option ?php endforeach; ? /select Jednak zalogowani u(cid:298)ytkownicy b(cid:266)d(cid:261) mieli dodatkowo prawo do usuwania wiadomo- (cid:286)ci, a do wykonania tej czynno(cid:286)ci pos(cid:225)u(cid:298)y np. przycisk dost(cid:266)pny na ekranie konkret- nej wiadomo(cid:286)ci. Ekran ten móg(cid:225)by mie(cid:252) wi(cid:266)c posta(cid:252) przedstawion(cid:261) na rysunku 1.9. Rysunek 1.9. Wiadomo(cid:286)(cid:252) z przyciskiem pozwalaj(cid:261)cym na jej usuni(cid:266)cie Mog(cid:261) tu wyst(cid:261)pi(cid:252) dwa warianty zwi(cid:261)zane z interfejsem aplikacji. W pierwszym przycisk jest wy(cid:286)wietlany zawsze, niezale(cid:298)nie od tego, czy u(cid:298)ytkownik jest zalogowany, czy te(cid:298) nie. Zmienia si(cid:266) jedynie stan tego elementu, który b(cid:266)dzie aktywny po zalogowaniu. Kod szablonu generuj(cid:261)cego ekran wiadomo(cid:286)ci móg(cid:225)by mie(cid:252) wi(cid:266)c posta(cid:252) przedsta- wion(cid:261) na listingu 1.10 (pe(cid:225)ny kod przyk(cid:225)adu znajduje si(cid:266) w katalogu r01examp02a). Listing 1.10. Podejmowanie decyzji o stanie przycisku div id= mainpart ?php if($msg): echo $msg[ title ]; echo br / ; echo $msg[ body ]; if(!isset($_SESSION[ zalogowany ])): $disabled = disabled= disabled ; else: $disabled = ; endif; ? div form action= index.php method= post input type= submit value= Usu(cid:275) wiadomo(cid:295)(cid:232) ?php echo $disabled; ? input type= hidden name= action value= deletemsg input type= hidden name= id value= ?php echo $msg[ id ]; ? /form Kup książkęPoleć książkę 20 Tworzenie bezpiecznych aplikacji internetowych (z przyk(cid:228)adami w PHP) /div ?php else: echo Nie ma nic do wy(cid:295)wietlenia. ; endif; ? /div Je(cid:298)eli zmienna $msg jest ustawiona (czyli s(cid:261) dost(cid:266)pne dane), wiadomo(cid:286)(cid:252) jest wy(cid:286)wietlana oraz ustalany jest stan pomocniczej zmiennej $disabled, która pozwoli wy(cid:225)(cid:261)czy(cid:252) przycisk usuwania dla niezalogowanych u(cid:298)ytkowników. A zatem gdy nie istnieje zmien- na sesji zalogowany, w zmiennej $disabled zapisywany jest atrybut disabled (dla znacz- nika input ), a w przeciwnym przypadku zmienna ta otrzymuje pusty ci(cid:261)g znaków. Pod wiadomo(cid:286)ci(cid:261) znajduje si(cid:266) formularz z przyciskiem Usu(cid:276) wiadomo(cid:286)(cid:252). Formularz jest przekazywany do skryptu index.php za pomoc(cid:261) metody POST. Wida(cid:252), (cid:298)e przeka- zywane s(cid:261) parametry action oraz id. Pierwszy wskazuje akcj(cid:266), która ma by(cid:252) wyko- nana (w tym przypadku deletemsg), a drugi — identyfikator wiadomo(cid:286)ci. W drugim wariancie przycisk jest wy(cid:286)wietlany tylko zalogowanym u(cid:298)ytkownikom. Kod szablonu b(cid:266)dzie wi(cid:266)c podobny do przedstawionego na listingu 1.10, formularz z przyci- skiem b(cid:266)dzie jednak w innym miejscu, a warunek instrukcji if b(cid:266)dzie odwrotny. Omawiany fragment skryptu przyjmie zatem posta(cid:252) widoczn(cid:261) na listingu 1.11 (powta- rzaj(cid:261)ce si(cid:266) fragmenty zosta(cid:225)y pomini(cid:266)te; pe(cid:225)ny kod przyk(cid:225)adu znajduje si(cid:266) w katalogu r01examp02b). Listing 1.11. Ustalenie, czy przycisk ma si(cid:266) znale(cid:296)(cid:252) w formularzu div id= mainpart ?php if($msg): //tutaj instrukcje wy(cid:286)wietlaj(cid:261)ce wiadomo(cid:286)(cid:252) if(isset($_SESSION[ zalogowany ])): ? div !-- tutaj formularz z przyciskiem usuwania -- /div ?php endif; ? ?php else: echo Nie ma nic do wy(cid:295)wietlenia. ; endif; ? /div A zatem po wy(cid:286)wietleniu wiadomo(cid:286)ci badane jest, czy istnieje zmienna sesji zalogowany (czyli czy mamy do czynienia z zalogowanym u(cid:298)ytkownikiem). Je(cid:286)li tak, do kodu wyni- kowego do(cid:225)(cid:261)czany jest formularz. Je(cid:286)li nie, formularz jest pomijany (formularz b(cid:266)dzie mia(cid:225) tak(cid:261) sam(cid:261) tre(cid:286)(cid:252) jak na listingu 1.10). Kup książkęPoleć książkę Rozdzia(cid:228) 1. (cid:105) Kontrola dost(cid:246)pu do danych i funkcji 21 Mo(cid:298)na za(cid:225)o(cid:298)y(cid:252), (cid:298)e wiadomo(cid:286)(cid:252) b(cid:266)dzie usuwana za pomoc(cid:261) funkcji deletemsg wywo(cid:225)ywa- nej bezpo(cid:286)rednio po otrzymaniu przez skrypt parametru action o warto(cid:286)ci deletemsg. Funkcja ta b(cid:266)dzie sprawdza(cid:225)a, czy dost(cid:266)pny jest parametr id, usuwa(cid:225)a wiadomo(cid:286)(cid:252) i ustawia(cid:225)a komunikat wy(cid:286)wietlany u(cid:298)ytkownikowi w odpowiedzi na wykonan(cid:261) ak- cj(cid:266). Za(cid:225)ó(cid:298)my, (cid:298)e kod wygl(cid:261)da tak jak na listingu 1.12. Listing 1.12. Funkcja usuwaj(cid:261)ca wiadomo(cid:286)(cid:252) function deletemsg() { $komunikat = B(cid:273)(cid:250)dne dane. Akcja anulowana. ; if(isset($_POST[ id ])){ $id = intval($_POST[ id ]); if($id 0){ //tutaj kod usuwaj(cid:261)cy wiadomo(cid:286)(cid:252) z bazy $komunikat = Wiadomo(cid:295)(cid:232) zosta(cid:273)a usuni(cid:250)ta. ; } } $this- setMessage($komunikat); } Sprawdzamy, czy w tablicy $_POST istnieje klucz (indeks) id. Je(cid:286)li tak jest, jego war- to(cid:286)(cid:252) jest odczytywana, konwertowana na typ ca(cid:225)kowity i zapisywana w zmiennej $id. Gdy warto(cid:286)(cid:252) tej zmiennej jest wi(cid:266)ksza od 0, wiadomo(cid:286)(cid:252) o wskazanym identyfikatorze jest usuwana (w przyk(cid:225)adowych plikach dost(cid:266)pnych na FTP zosta(cid:225) zawarty przyk(cid:225)a- dowy kod symuluj(cid:261)cy usuni(cid:266)cie wiadomo(cid:286)ci). Wida(cid:252) wyra(cid:296)nie, (cid:298)e przy takiej realizacji w projekcie wyst(cid:266)puj(cid:261) b(cid:225)(cid:266)dy tego samego typu, jaki by(cid:225) omawiany w podrozdzia(cid:225)ach dotycz(cid:261)cych kontroli dost(cid:266)pu do danych. Je(cid:286)li zosta(cid:225)a zastosowana wersja z listingu 1.10, niezalogowany u(cid:298)ytkownik na pod- stawie analizy kodu (cid:296)ród(cid:225)owego jest w stanie (cid:225)atwo stwierdzi(cid:252), jakie parametry nale(cid:298)y przes(cid:225)a(cid:252) do skryptu, aby usun(cid:261)(cid:252) wybran(cid:261) wiadomo(cid:286)(cid:252). Mo(cid:298)e wi(cid:266)c wys(cid:225)a(cid:252) je bezpo- (cid:286)rednio, np. konstruuj(cid:261)c w(cid:225)asny formularz. Problemu nie stwarzaj(cid:261) równie(cid:298) modyfi- kacja interfejsu strony i uaktywnienie przycisku. Samo zalogowanie nie b(cid:266)dzie ko- nieczne, gdy(cid:298) w funkcji deletemsg nie jest przeprowadzana weryfikacja uprawnie(cid:276). W przypadku kodu z listingu 10.11 atakuj(cid:261)cy b(cid:266)dzie mia(cid:225) nieco wi(cid:266)kszy problem, ponie- wa(cid:298) nie jest w stanie w prosty sposób (bez zalogowania) stwierdzi(cid:252), jakie parametry nale(cid:298)y wys(cid:225)a(cid:252) do serwera, aby wykasowa(cid:252) wiadomo(cid:286)(cid:252). Je(cid:286)li jednak zauwa(cid:298)y, (cid:298)e do wy(cid:286)wietlenia stosowany jest parametr action o warto(cid:286)ci showmsg, to zapewne wypróbuje ró(cid:298)ne kombinacje ze s(cid:225)owami „del”, „delete” itp. Poza tym zalogowany u(cid:298)ytkownik widzi ju(cid:298) parametry, wi(cid:266)c mo(cid:298)e je upowszechni(cid:252). Sama zmiana warto(cid:286)ci parametru action z deletemsg na dowoln(cid:261) inn(cid:261) (móg(cid:225)by to by(cid:252) przecie(cid:298) nic nie znacz(cid:261)cy ci(cid:261)g) te(cid:298) nie mo(cid:298)e by(cid:252) traktowana jako zabezpieczenie, a jedynie utrudnienie dla w(cid:225)amy- wacza. Weryfikacja uprawnie(cid:276) jest wi(cid:266)c niezb(cid:266)dna i nie mo(cid:298)na o niej zapomnie(cid:252). Sprawdzenie uprawnie(cid:276) u(cid:298)ytkownika do usuwania wiadomo(cid:286)ci mo(cid:298)e by(cid:252) zrealizo- wane np. w sposób przedstawiony na listingu 1.13 (pe(cid:225)ny kod przyk(cid:225)adu dost(cid:266)pny jest w katalogu r01examp02c). Kup książkęPoleć książkę 22 Tworzenie bezpiecznych aplikacji internetowych (z przyk(cid:228)adami w PHP) Listing 1.13. Sprawdzanie uprawnie(cid:276) u(cid:298)ytkownika do wykonania funkcji function deletemsg() { if(!isset($_SESSION[ zalogowany ])){ $komunikat = Brak uprawnie(cid:275). Akcja anulowana. ; } else if(isset($_POST[ id ])){ //tutaj kod usuwaj(cid:261)cy wiadomo(cid:286)(cid:252) z listingu 1.12 $komunikat = Wiadomo(cid:295)(cid:232) zosta(cid:273)a usuni(cid:250)ta. ; } else{ $komunikat = B(cid:273)(cid:250)dne dane. Akcja anulowana. ; } $this- setMessage($komunikat); } Tym razem w funkcji deletemsg znajduje si(cid:266) z(cid:225)o(cid:298)ona instrukcja warunkowa rozpa- truj(cid:261)ca mo(cid:298)liwe sytuacje. Najpierw badane jest, czy mamy do czynienia z zalogowa- nym u(cid:298)ytkownikiem, czyli czy istnieje zmienna sesji zalogowany (w tablicy $_SESSION znajduje si(cid:266) klucz o nazwie zalogowany). Je(cid:286)li zmiennej nie ma, bie(cid:298)(cid:261)cy u(cid:298)ytkownik nie ma te(cid:298) uprawnie(cid:276) do kasowania wiadomo(cid:286)ci. Ustawiany jest wtedy odpowiedni komunikat i funkcja ko(cid:276)czy dzia(cid:225)anie. Je(cid:298)eli u(cid:298)ytkownik jest zalogowany, sprawdza- ne jest, czy za pomoc(cid:261) metody POST zosta(cid:225) przekazany parametr, a dalej wykonywany jest taki sam kod jak w przypadku przyk(cid:225)adu z listingu 1.12 — usuni(cid:266)cie wiadomo(cid:286)ci (o ile warto(cid:286)(cid:252) parametru jest prawid(cid:225)owa). Ostatni przypadek ma miejsce, gdy u(cid:298)yt- kownik jest zalogowany, zosta(cid:225)a wykonana akcja deletemsg, ale brakuje parametru id. Wtedy ustawiany jest komunikat informuj(cid:261)cy o nieprawid(cid:225)owych danych. Modyfikowanie (cid:276)(cid:241)da(cid:254) HTTP Na pocz(cid:261)tku rozdzia(cid:225)u zaprezentowano, (cid:298)e do utworzenia (cid:298)(cid:261)dania typu POST mo(cid:298)na u(cid:298)y(cid:252) zwyk(cid:225)ego formularza (listing 1.5). Wygodniejsze jest jednak skorzystanie z na- rz(cid:266)dzi pozwalaj(cid:261)cych na manipulacj(cid:266) transmisj(cid:261) HTTP. Jednym z nich, cz(cid:266)sto u(cid:298)y- wanym przy testach penetracyjnych aplikacji internetowych, jest Fiddler. Po urucho- mieniu tego programu w zak(cid:225)adce Composer (rysunek 1.10) mo(cid:298)na przygotowa(cid:252) dowolne (cid:298)(cid:261)danie HTTP przesy(cid:225)ane za pomoc(cid:261) ró(cid:298)nych wersji tego protoko(cid:225)u oraz ró(cid:298)nych metod (w tym najpopularniejszych GET i POST, ale tak(cid:298)e innych). W polu adresu (B) wpisujemy adres strony, np. http://nazwa.domeny/r01examp02a/ index.php, je(cid:286)li chcemy skorzysta(cid:252) z przyk(cid:225)adu z katalogu r01examp02a. Z listy z lewej strony (A) wybieramy metod(cid:266) transmisji danych; dla wspomnianego przyk(cid:225)adu b(cid:266)dzie to POST. Lista z prawej strony (C) pozwala na wskazanie wersji protoko(cid:225)u HTTP. Powszech- nie stosowana jest wersja HTTP/1.1 i jest to opcja domy(cid:286)lna, nie trzeba wi(cid:266)c jej zmienia(cid:252). W polu Request Headers (D) nale(cid:298)y wprowadzi(cid:252) nag(cid:225)ówki HTTP, które zostan(cid:261) wys(cid:225)ane do serwera. Poniewa(cid:298) za pomoc(cid:261) metody POST chcemy przekaza(cid:252) parametry — b(cid:266)d(cid:261) to action i id (przyk(cid:225)ad r01examp02a) — niezb(cid:266)dny b(cid:266)dzie nag(cid:225)ówek Content-Type. W polu Request Body (E) nale(cid:298)y poda(cid:252) nazwy parametrów i ich warto(cid:286)ci zgodne z wybranym typem kodowania (w tym przypadku x-www-form-urlencoded). Kup książkęPoleć książkę Rozdzia(cid:228) 1. (cid:105) Kontrola dost(cid:246)pu do danych i funkcji 23 Rysunek 1.10. Tworzenie (cid:298)(cid:261)dania HTTP Po wprowadzeniu danych mo(cid:298)na wykona(cid:252) (cid:298)(cid:261)danie, wciskaj(cid:261)c przycisk Execute (F). Na li(cid:286)cie widocznej z lewej strony okna (rysunek 1.11A) pojawi(cid:261) si(cid:266) sesje nawi(cid:261)zane w zwi(cid:261)zku z (cid:298)(cid:261)daniem. Wida(cid:252) wyra(cid:296)nie, (cid:298)e (cid:298)(cid:261)danie wys(cid:225)ane za pomoc(cid:261) metody POST spowodowa(cid:225)o zwrócenie nag(cid:225)ówka przekierowuj(cid:261)cego (kod odpowiedzi serwera 302), a wi(cid:266)c aplikacja korzysta z wzorca PRG (ang. Post/Redirect/Get). Dopiero kolejne (cid:298)(cid:261)da- nie (kod odpowiedzi 200) zawiera tre(cid:286)(cid:252) strony. Po klikni(cid:266)ciu pierwszej sesji i wybraniu zak(cid:225)adki Inspectors (B) w polu (cid:296)ród(cid:225)owym (C) mo(cid:298)na te(cid:298) zobaczy(cid:252) szczegó(cid:225)y wys(cid:225)anego (cid:298)(cid:261)dania. Wida(cid:252), (cid:298)e Fiddler doda(cid:225) nag(cid:225)ówki Host (formalnie wymagany przez protokó(cid:225) HTTP w wersji 1.1) i Content-Length. Rysunek 1.11. Szczegó(cid:225)y (cid:298)(cid:261)dania POST wys(cid:225)anego do serwera Klikaj(cid:261)c drugie odwo(cid:225)anie (rysunek 1.12) wykonane po przekierowaniu, oprócz tre(cid:286)ci (cid:298)(cid:261)dania mo(cid:298)na w polu odpowiedzi serwera obejrze(cid:252) tre(cid:286)(cid:252) strony wynikowej. Po przej(cid:286)ciu na zak(cid:225)adk(cid:266) SyntaxView (o ile zosta(cid:225)o zainstalowane odpowiednie rozszerzenie) wi- doczny b(cid:266)dzie pokolorowany kod (cid:296)ród(cid:225)owy, w którym da si(cid:266) odnale(cid:296)(cid:252) komunikat o usuni(cid:266)ciu z serwera wiadomo(cid:286)ci o identyfikatorze przekazanym w pierwszym (cid:298)(cid:261)da- niu (oczywi(cid:286)cie mo(cid:298)na te(cid:298) skorzysta(cid:252) z widoku tekstowego TextView, jednak nie b(cid:266)- dzie on tak czytelny). W podanym przyk(cid:225)adzie zosta(cid:225)y wys(cid:225)ane jedynie trzy nag(cid:225)ówki: jeden wprowadzony r(cid:266)cznie i dwa dodane przez Fiddlera ze wzgl(cid:266)du na wymagania protoko(cid:225)u HTTP. Z regu(cid:225)y jednak serwer otrzymuje od przegl(cid:261)darki ca(cid:225)y zestaw nag(cid:225)ówków. Ich r(cid:266)czne wpisywanie by(cid:225)oby niewygodne i czasoch(cid:225)onne. Mo(cid:298)na jednak w prosty sposób u(cid:298)y(cid:252) nag(cid:225)ówków Kup książkęPoleć książkę 24 Tworzenie bezpiecznych aplikacji internetowych (z przyk(cid:228)adami w PHP) Rysunek 1.12. Podgl(cid:261)d (cid:296)ród(cid:225)a strony pobranej po przekierowaniu z wcze(cid:286)niejszego (cid:298)(cid:261)dania. Wystarczy w przegl(cid:261)darce (lub w Fiddlerze) odwo(cid:225)a(cid:252) si(cid:266) do strony, a nast(cid:266)pnie przeci(cid:261)gn(cid:261)(cid:252) sesj(cid:266), która pojawi si(cid:266) wtedy na li(cid:286)cie z lewej strony, do zak(cid:225)adki Composer. Wszystkie nag(cid:225)ówki zostan(cid:261) wówczas skopiowane do pola Request Headers (rysunek 1.13) i b(cid:266)dzie mo(cid:298)na je dowolnie modyfikowa(cid:252). Jest to o tyle wy- godne, (cid:298)e w ten sposób mo(cid:298)na pod(cid:225)(cid:261)czy(cid:252) si(cid:266) pod istniej(cid:261)c(cid:261) na serwerze sesj(cid:266) zainicjowa- n(cid:261) przez zwyk(cid:225)e wywo(cid:225)anie strony w przegl(cid:261)darce (skopiowany zostanie bowiem równie(cid:298) nag(cid:225)ówek Cookie z identyfikatorem sesji, jak wida(cid:252) na rysunku 1.13). Rysunek 1.13. Kopiowanie istniej(cid:261)cych nag(cid:225)ówków HTTP Bardzo u(cid:298)yteczn(cid:261) cech(cid:261) Fiddlera jest mo(cid:298)liwo(cid:286)(cid:252) zatrzymywania (cid:298)(cid:261)dania oraz odpo- wiedzi serwera spe(cid:225)niaj(cid:261)cych okre(cid:286)lony warunek. Po zatrzymaniu transmisji mo(cid:298)na dokona(cid:252) dowolnych modyfikacji danych. Za(cid:225)ó(cid:298)my np., (cid:298)e chcemy wy(cid:286)wietli(cid:252) pewn(cid:261) Kup książkęPoleć książkę Rozdzia(cid:228) 1. (cid:105) Kontrola dost(cid:246)pu do danych i funkcji 25 wiadomo(cid:286)(cid:252) z przyk(cid:225)adu r01examp02a. W przegl(cid:261)darce wpisujemy adres http://localhost/ r01examp02a/index.php — w Fiddlerze pojawi si(cid:266) sesja odpowiadaj(cid:261)ca temu odwo- (cid:225)aniu. Takie (cid:298)(cid:261)danie zostanie obs(cid:225)u(cid:298)one w standardowy sposób, a tre(cid:286)(cid:252) wynikowa po- jawi si(cid:266) w przegl(cid:261)darce (tre(cid:286)(cid:252) (cid:298)(cid:261)dania oraz odpowiedzi mo(cid:298)na przegl(cid:261)da(cid:252) w odpowied- nich panelach). Ustawmy teraz pu(cid:225)apk(cid:266), która zatrzyma (cid:298)(cid:261)danie wy(cid:286)wietlenia konkretnej wiadomo(cid:286)ci (dzi(cid:266)ki temu b(cid:266)dzie mo(cid:298)na je podejrze(cid:252) i zmodyfikowa(cid:252)). Powinna ona dotyczy(cid:252) tylko odwo(cid:225)a(cid:276) do strony tego konkretnego przyk(cid:225)adu. W polu pod list(cid:261) (rysunek 1.14) wpi- sujemy ci(cid:261)g: bpu r01examp02a lub pe(cid:225)ny URL: bpu http://nazwa.domeny/r01examp02a/index.php Rysunek 1.14. Ustawianie pu(cid:225)apki w Fiddlerze Nast(cid:266)pnie wracamy do przegl(cid:261)darki i wskazujemy na li(cid:286)cie dowoln(cid:261) wiadomo(cid:286)(cid:252), po czym wciskamy przycisk Sprawd(cid:296) wiadomo(cid:286)(cid:252) (u(cid:298)ywamy wi(cid:266)c standardowego inter- fejsu strony WWW). (cid:297)(cid:261)danie pobrania strony zostanie wtedy zatrzymane i uaktywni si(cid:266) okno Fiddlera. Transmitowane dane mo(cid:298)na dowolnie modyfikowa(cid:252). W zak(cid:225)adce Headers wida(cid:252) przesy(cid:225)ane nag(cid:225)ówki oraz pe(cid:225)ny URL — mo(cid:298)liwa jest jego zmiana (rysunek 1.15), a w zak(cid:225)adce WebForms mo(cid:298)na w wygodny sposób przegl(cid:261)da(cid:252) i modyfikowa(cid:252) prze- sy(cid:225)ane parametry (rysunek 1.16). Mo(cid:298)na wi(cid:266)c zmodyfikowa(cid:252) tre(cid:286)(cid:252) (cid:298)(cid:261)dania, zmienia- j(cid:261)c np. warto(cid:286)(cid:252) parametru id. Rysunek 1.15. Zatrzymanie (cid:298)(cid:261)dania typu GET Po wykonaniu zmian mo(cid:298)na kontynuowa(cid:252) (cid:298)(cid:261)danie i uzyska(cid:252) odpowied(cid:296) — s(cid:225)u(cid:298)y do tego przycisk Run to Completion, lub te(cid:298) automatycznie ustawi(cid:252) pu(cid:225)apk(cid:266) na odpowie- dzi serwera — s(cid:225)u(cid:298)y do tego przycisk Break on Response. U(cid:298)yjmy tej drugiej opcji. Kup książkęPoleć książkę 26 Tworzenie bezpiecznych aplikacji internetowych (z przyk(cid:228)adami w PHP) Rysunek 1.16. Widok parametrów przesy(cid:225)anych w (cid:298)(cid:261)daniu Pozwoli to na wprowadzenie modyfikacji do strony wynikowej generowanej przez serwer. W oknie odpowiedzi pojawi si(cid:266) tre(cid:286)(cid:252) tej strony. Zosta(cid:225)a przechwycona przez Fiddlera, a przegl(cid:261)darka ca(cid:225)y czas czeka na odpowied(cid:296). Zanim jednak wypu(cid:286)cimy kod strony do przegl(cid:261)darki, zmodyfikujmy kod (cid:296)ród(cid:225)owy, odblokowuj(cid:261)c przycisk usuwa- nia wiadomo(cid:286)ci. Wystarczy usun(cid:261)(cid:252) atrybut disabled z odpowiedniego znacznika input (rysunek 1.17). Po dokonaniu tej zmiany klikamy Run to Completion. Strona (ju(cid:298) zmody- fikowana) pow(cid:266)druje do przegl(cid:261)darki, gdzie b(cid:266)dzie mo(cid:298)na sprawdzi(cid:252), (cid:298)e przycisk, który mia(cid:225) by(cid:252) zablokowany, sta(cid:225) si(cid:266) aktywny. Rysunek 1.17. Modyfikacja odpowiedzi serwera Kup książkęPoleć książkę Skorowidz A adopcja sesji, 182–183 atak CRSF, 115, 12
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Tworzenie bezpiecznych aplikacji internetowych (z przykładami w PHP)
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: