Standardowe narzędzia PHP do filtrowania danych
Killavus dnia Luty 19, 2011
Filtrowanie danych to jedna z najważniejszych i często pomijanych przez początkujących web developerów aspektów budowania sprawnej aplikacji sieciowej. W dzisiejszych czasach, gdy posiadamy tak potężne narzędzia jak PDO (artykuł) często walidacja danych przychodzących od użytkownika uchodzi nam płazem. Niestety, nie zawsze. Ataki XSS (Cross Site Scripting) potrafią być naprawdę niebezpieczne i sprawić, że zaufanie użytkowników do naszej strony spadnie dramatycznie.
Na przestrzeni wieków (brzmi dumnie) programiści sieciowi różnie radzili sobie z tym problemem. Czy to za pomocą wyrażeń regularnych, czy za pomocą wbudowanych w język funkcji niekoniecznie do tego służących. Od PHP 5.2 istnieją jednak dedykowane rozwiązania do radzenia sobie z tym problemem i o nich opowiemy w tym artykule.
Dlaczego to jest fajne?
Rodzina funkcji filter_* jest bardzo ciekawym narzędziem i jest ciekawa z kilku powodów. Przede wszystkim, posiada dość bogatą ofertę filtrów, które możemy zastosować. Działa także dwojako – pozwala na weryfikację danych jak również ich przetworzenie (sanitizing) do obowiązującego formatu. Wprowadza to pewną kulturę kodu – zamiast używać konstrukcji w stylu:
1 | $foo = strip_tags($foo); |
Używamy wywołania funkcji, która automagicznie zamienia nam to co w zmiennej na przetworzony odpowiednik.
No ok, ale o czym mowa?
Sprawa jest dość prosta i spowadza się do kilku prostych funkcji, których używamy w naszej aplikacji. Są to, kolejno: filter_input, filter_val, filter_var_array i filter_input_array. Są to tak naprawdę dwie funkcje wraz z ich „tablicowymi” odpowiednikami, gdybyśmy chcieli filtrować kilka zmiennych na raz.
filter_input:
filter_input służy do filtrowania danych, które zawarte są w supertablicach, które pobierają dane od użytkownika i maszyny – $_POST, $_GET, $_SERVER, $_COOKIE i $_ENV. Składnia jest następująca:
1 | filter_input( $typDanych, $klucz, $używaneFiltry, $opcje ); |
$typDanych wskazuje tablice, której klucz wpisujemy – jest to jedna ze stałych: FILTER_POST, FILTER_GET, FILTER_SERVER, FILTER_COOKIE lub FILTER_ENV. Myślę, że nazwy tłumaczą wszystko i nie trzeba się nad nimi specjalnie rozwodzić. $klucz wskazuje na daną, którą chcemy przefiltrować – przykładowo, gdy chcemy filtrować $_POST['foo'], $typDanych ustawiamy na FILTER_POST, a $klucz na ‘foo’. $używaneFiltry to zmienna stanowiąca tak naprawdę wszystko. Tutaj ustawiamy, jakie filtry mają zostać użyte, ‘scalając je’ operatorem binarnej alternatywy (co pewnie zna każdy programujący w C) „|”. Ostatni argument $opcje jest używany, gdy ustawiamy flagę, która z takich opcji korzysta. Jest to tablica asocjacyjna Myślę, że najlepiej zobrazuje to przykład (a nawet kilka):
1 2 3 4 5 | $options = array( 'flags' => FILTER_FLAG_ALLOW_HEX, 'min_range' => 100, 'max_range' => 200 ); if( filter_val( FILTER_POST, 'foo', FILTER_VALIDATE_INT, $options ) !== FALSE ) { // jeżeli $_POST['foo'] jest liczbą całkowitą w systemie dziesiętnym lub heksadecymalnym od 100 do 200 to wykonaj ifa. } filter_val( FILTER_POST, 'foo2', FILTER_SANITIZE_INT, $options ); // podstawia NULL, jeżeli dana nie spełnia założeń... |
Jak widać, użycie tych filtrów jest bardzo proste. Przede wszystkim jest także rozszerzalne – niektóre biblioteki dodają nowe filtry, których listę możemy sprawdzić za pomocą funkcji filter_list.
Lista wszystkich filtrów
Na oficjalnej stronie PHP jest poradnik dotyczący wszystkich funkcji z rodziny filter_. Możemy znaleźć go pod tym adresem.
Podsumowanie
Rodzina tych funkcji stanowi kompleksowe rozwiązanie problemu filtrowania danych wysyłanych przez użytkownika do naszej aplikacji dla programistów PHP. Piszę o nich, gdyż rzadko kiedy widzę zastosowanie ich w praktyce – a szkoda, bo są to dopracowane i bardzo przydatne przy budowaniu stron funkcje.
Zatem, do napisania!
Zostaw komentarz