Zatrzymać!
Popełniasz błąd. Och, nie, wybrałeś odpowiednie funkcje PHP, aby Twoje dane były nieco bezpieczniejsze. W porządku. Twój błąd dotyczy kolejności operacji oraz sposobu i miejsca korzystania z tych funkcji.
Ważne jest, aby zrozumieć różnicę między oczyszczaniem i sprawdzaniem poprawności danych użytkownika, ucieczką danych do przechowywania i ucieczką do prezentacji.
Odkażanie i weryfikacja danych użytkownika
Kiedy użytkownicy przesyłają dane, musisz się upewnić, że dostarczyli coś, czego oczekujesz.
Odkażanie i filtrowanie
Na przykład, jeśli oczekujesz liczby, upewnij się, że przesłane dane to liczba . Możesz także rzutować dane użytkownika na inne typy. Wszystko, co zostało przesłane, jest początkowo traktowane jak ciąg, więc wymuszenie, aby znane dane numeryczne były liczbami całkowitymi lub zmiennoprzecinkowymi, czyni czyszczenie szybkim i bezbolesnym.
A co z dowolnymi polami tekstowymi i obszarami tekstowymi? Musisz się upewnić, że w tych dziedzinach nie ma nic nieoczekiwanego. Przede wszystkim musisz się upewnić, że pola, które nie powinny zawierać treści HTML, w rzeczywistości nie zawierają HTML. Istnieją dwa sposoby rozwiązania tego problemu.
Najpierw możesz spróbować eskapować dane wejściowe HTML za pomocą htmlspecialchars
. Nie powinieneś używać htmlentities
do neutralizowania HTML, ponieważ wykona on również kodowanie znaków akcentowanych i innych znaków, które według niego również powinny być zakodowane.
Po drugie, możesz spróbować usunąć dowolny możliwy kod HTML. strip_tags
jest szybki i łatwy, ale też niechlujny. HTML Purifier wykonuje znacznie dokładniejszą pracę, zarówno usuwając cały HTML, jak i umożliwiając selektywną białą listę tagów i atrybutów.
Nowoczesne wersje PHP są dostarczane z rozszerzeniem filtra , które zapewnia kompleksowy sposób oczyszczania danych wprowadzanych przez użytkownika.
Uprawomocnienie
Upewnienie się, że przesłane dane są wolne od nieoczekiwanych treści, to tylko połowa pracy. Musisz także spróbować upewnić się, że przesłane dane zawierają wartości, z którymi możesz faktycznie pracować.
Jeśli spodziewasz się liczby od 1 do 10, musisz sprawdzić tę wartość. Jeśli używasz jednego z tych nowych, wymyślnych liczbowych danych wejściowych ery HTML5 z pokrętłem i krokami, upewnij się, że przesłane dane są zgodne z krokiem.
Jeśli te dane pochodzą z tego, co powinno być menu rozwijanym, upewnij się, że przesłana wartość jest taka, która pojawiła się w menu.
A co z danymi wejściowymi, które spełniają inne potrzeby? Na przykład dane wejściowe powinny być sprawdzane za pomocą strtotime
lub klasy DateTime . Podana data powinna mieścić się w oczekiwanych zakresach. A co z adresami e-mail? Wspomniane wcześniej rozszerzenie filtru może sprawdzić, czy adres jest poprawnie sformułowany, chociaż jestem fanem biblioteki is_email .
To samo dotyczy wszystkich innych kontrolek formularza. Masz przyciski opcji? Sprawdź na liście. Masz pola wyboru? Sprawdź na liście. Czy przesłać plik? Upewnij się, że plik jest odpowiedniego typu i traktuj jego nazwę jak niefiltrowane dane użytkownika.
Każda nowoczesna przeglądarka ma wbudowany pełny zestaw narzędzi programistycznych, co sprawia, że manipulowanie formularzem jest dla każdego banalne. Twój kod powinien zakładać, że użytkownik całkowicie usunął wszystkie ograniczenia po stronie klienta dotyczące zawartości formularza !
Ucieczka danych do przechowywania
Po upewnieniu się, że dane są w oczekiwanym formacie i zawierają tylko oczekiwane wartości, musisz się martwić o zachowanie tych danych w pamięci.
Każdy mechanizm przechowywania danych ma określony sposób, aby upewnić się, że dane są odpowiednio chronione i zakodowane. Jeśli tworzysz SQL, to akceptowanym sposobem przekazywania danych w zapytaniach są przygotowane instrukcje z symbolami zastępczymi .
Jednym z lepszych sposobów pracy z większością baz danych SQL w PHP jest rozszerzenie PDO . Postępuje zgodnie z powszechnym schematem przygotowywania instrukcji , wiążąc zmienne z instrukcją , a następnie wysyłając instrukcję i zmienne do serwera . Jeśli wcześniej nie pracowałeś z PDO, oto całkiem niezły samouczek zorientowany na MySQL .
Niektóre bazy danych SQL mają własne rozszerzenia w PHP, w tym SQL Server , PostgreSQL i SQLite 3 . Każde z tych rozszerzeń ma przygotowaną obsługę instrukcji, która działa w ten sam sposób, co PDO. Czasami może być konieczne użycie tych rozszerzeń zamiast PDO do obsługi niestandardowych funkcji lub zachowania.
MySQL ma również własne rozszerzenia PHP. A właściwie dwóch. Chcesz używać tylko tego o nazwie mysqli . Stare rozszerzenie „mysql” zostało wycofane i nie jest bezpieczne ani rozsądne w użyciu we współczesnych czasach.
Osobiście nie jestem fanem mysqli. Sposób, w jaki wykonuje zmienne wiązanie przygotowanych instrukcji, jest nieelastyczny i może być trudny w użyciu. W razie wątpliwości użyj zamiast tego PDO.
Jeśli nie używasz bazy danych SQL do przechowywania danych, zapoznaj się z dokumentacją interfejsu bazy danych, którego używasz, aby określić, jak bezpiecznie przekazywać przez nią dane.
Jeśli to możliwe, upewnij się, że Twoja baza danych przechowuje dane w odpowiednim formacie. Przechowuj liczby w polach numerycznych. Przechowuj daty w polach dat. Przechowuj pieniądze w polu dziesiętnym, a nie zmiennoprzecinkowym. Przejrzyj dokumentację dostarczoną przez bazę danych, aby dowiedzieć się, jak prawidłowo przechowywać różne typy danych.
Ucieczka danych do prezentacji
Za każdym razem, gdy pokazujesz dane użytkownikom, musisz upewnić się, że dane są bezpieczne, chyba że wiesz, że nie należy ich uciekać.
Emitując HTML, prawie zawsze powinieneś przekazywać wszelkie dane, które zostały pierwotnie dostarczone przez użytkownika htmlspecialchars
. W rzeczywistości jedyny raz, kiedy nie powinieneś tego robić, to kiedy wiesz, że użytkownik dostarczył HTML i wiesz, że został on już oczyszczony za pomocą białej listy.
Czasami trzeba wygenerować JavaScript za pomocą PHP. Javascript nie ma takich samych reguł ucieczki jak HTML! Bezpiecznym sposobem na dostarczenie wartości dostarczonych przez użytkownika do JavaScript za pośrednictwem PHP jest przejście json_encode
.
I więcej
Walidacja danych ma znacznie więcej niuansów.
Na przykład kodowanie zestawu znaków może być ogromną pułapką . Twoja aplikacja powinna być zgodna z praktykami opisanymi w „ UTF-8 do końca ”. Istnieją hipotetyczne ataki, które mogą wystąpić, gdy traktujesz dane łańcuchowe jako niewłaściwy zestaw znaków.
Wcześniej wspomniałem o narzędziach do debugowania przeglądarki. Narzędzia te mogą być również używane do manipulowania danymi z plików cookie. Pliki cookie należy traktować jako niezaufane dane wejściowe użytkownika .
Sprawdzanie poprawności danych i ucieczka to tylko jeden aspekt bezpieczeństwa aplikacji internetowych. Powinieneś zapoznać się z metodologiami ataków na aplikacje internetowe , aby móc zbudować przed nimi ochronę.