Niemal wszyscy w swoich aplikacjach korzystają z formularzy, ale nie wiedzą że to jest niebezpieczne. Chytry użytkownik może to wykorzystać, jeżeli chcesz zabezpieczyć swoje formularze, przeczytaj ten artykuł.
Jeżeli korzystasz z PHP niemal pewnym jest że używasz w swoich skryptach różnych pól formularzy. I słusznie, są one pewną formą interakcji z użytkownikiem. Z pewnością większość z was nigdy nie zastanawiała się nad tym że ktoś może próbować załamać wasz skrypt. Mówiąc załamać mam na myśli użycie go do nie zamierzonego celu, lub w niezamierzony sposób. Nie trzeba być hakerem aby „rozpracować” stronę z kiepsko zrobionym skryptem, otóż załamać taki skrypt jest bardzo łatwo. To co przedstawię w tym artykule ma na celu przekazanie wam wiedzy w celu ulepszenia swoich skryptów, a nie załamywanie skryptów kogoś innego. Jeżeli wykryjecie na czyjejś stronie takie skrypty natychmiast dajcie znać administratorowi serwisu. Oczywiście nie będę tu uczył hakerstwa, powiem tylko co się może ewentualnie stać…
Zacznę od podania prostego przykładu. Wyobraźmy sobie że napisaliśmy skrypt, dzięki któremu każdy kto odwiedza twoją stronę może się do niego dopisać… Oczywiście jest to bardzo prosty skrypt, wpisuje się w pole tekstowe swoje imię i nazwisko, wciska guzik i po kłopocie. A teraz wyobraźmy sobie jakiegoś dowcipnisia który wpisuje w pole tekstowe coś takiego:
| <h1><b style=”font-family:Arial; border-style: solid”>Jaś Kowalski</b></h1> |
Wyobrażacie sobie jak to będzie wyglądało??? Ktoś następny wchodzi i od razu rzuca mu się napis Jaś Kowalski… Łatwy sposób na reklamę. Jak się przed czymś takim ustrzec, nic prostszego, przykładowo gdy zapisujemy wartość pola tekstowego do zmiennej $nazwisko, przed wyświetleniem jej na stronie możemy użyć instrukcji:
| $nazwisko = strip_tags($nazwisko); |
w wyniku zostanie wyświetlone sam napis „Jaś Kowalski”, ponieważ funkcja strip_tags() usuwa z podanego łańcucha znaków wszystkie znaczniki. Możemy Jasia załatwić w inny sposób, używając funkcji HTMLSpecialChars() w taki sposób:
| $nazwisko = HTMLSpecialChars($nazwisko); |
wtedy dla Jasia ukaże się dokładnie to co napisał, czyli:
| <h1><b style=”font-family:Arial; border-style: solid”>Jaś Kowalski</b></h1> |
z tego wpisu będzie widać co najwyżej że Jasio to cwaniak który zna HTML i wydaje się mu że jest Haker.
Taki Jasio jest jednak nie szkodliwy, co najwyżej śmieszny… Wyobraźmy sobie sytuację kiedy naszą stronę odwiedza starszy brat Jasia, Staś. Stasio ma o sobie większe mniemanie i wchodzi na stronę na której loguje się administrator, jest tam pole tekstowe w które należy wpisać hasło… Staś wpisuje nam coś takiego:
| eval(” echo strip_tags( implode( ’ ’ , file( $PHP_SELF ) ) ) „); |
nieco skomplikowany zapis, ale całkiem niebezpieczny, co prawda nie ma za wielkich szans na powodzenie, ale owszem może się udać. Funkcja eval() wykonuje łańcuch znaków zawarty wewnątrz jej jak gdyby był kodem PHP. funkcja echo wypisuje podaną wartość na ekran. Funkcja strip_tags, jak już wspominałem usuwa z podanego łańcucha znaków znaczniki HTMl i PHP. Funkcja file() zwraca podany plik w postaci tablicy, gdzie każdy element jest kolejną linią pliku. A $PHP_SELF to stała PHP zawierająca adres aktualnego dokumentu. A funkcja implode() łączy podana tablice w jeden ciąg. Jak nie trudno się domyślić, ta instrukcja pobierze aktualną stronę i wyświetli jej zawartość. Jeżeli sprawdzanie hasła odbywa się na stronie, najprawdopodobniej Stasio dostanie się do hasła… Jak tego uniknąć? Bardzo prosto, również używając funkcji strip_tags() na zmiennej przechowującej hasło przed jej wykorzystaniem.
W porządku, jeśli jednak mamy rozbudowany formularz, takie sprawdzanie każdej zmiennej może być żmudne, wtedy po prostu trzeba sobie napisać odpowiednią funkcję… Oto drobny przykład.
| function spr( $wartosc ) { $wartosc = strip_tags( $wartosc ); } |
i gotowe, funkcja nie zwraca wartości aby była krótsza i szybsza, po prostu będziemy przekazywać parametr przez zmienną. Przykładowo mamy zmienne zawierające wartości pól formularza: $imie, $nazwisko, $wiek. Aby je sprawdzić wpisujemy tak:
| spr(&imie); spr(&nazwisko); spr(&wiek); |
i po kłopocie, dzięki tej prostej funkcji możecie sobie oszczędzić wielu kłopotów, a przykładowy Jaś i Staś będą musieli albo znaleźć nowe sztuczki albo nauczyć się prawdziwego Hakerstwa.
