PHPowe filtry
Najważniejszym elementem zapewniającym bezpieczeństwo aplikacji jest dbanie o walidacje i filtrowanie danych zewnętrznych trafiających do skryptu za pośrednictwem tablic superglobalnych.
Większość programistów PHP podczas pracy korzysta z takich funkcji jak ctype_*, preg_mach, strip_tags etc. w celu kontroli danych wejściowych. Niewielu jednak (sądząc po popularności w G) wie o istnieniu / korzysta z mechanizmu wprowadzonego w piątej wersji PHP ułatwiającego ten proces.
Poniżej znajdują się dwa proste przykłady prezentujące jego możliwości.
Głównym elementem mechanizmu filtracji jest funkcja filter_input. Umożliwia ona pobranie wartości zmiennej znajdującej się w tablicy superglobalnej uwzględniając jej filtrację i walidację.
<?php $id = filter_input( INPUT_GET, 'id', FILTER_VALIDATE_INT ); if( is_null( $id ) ) { die( 'Brak parametru ID.' ); } elseif( $id === false ) { die( 'Podany parametr ID nie jest poprawn± liczb± ca³kowit±.' ); } else { die( 'ID: ' . $id ); } ?>
Na czym polega powyższy kod? Z tablicy _GET pobieramy wartość zmiennej id oraz ustalamy, że ma być ona typu integer. Jako wynik powyższej funkcji możemy otrzymać trzy wartości:
- null – w przypadku, gdy podana zmienna nie istnieje
- false – w przypadku, gdy wartość zmiennej nie spełnia wymogów walidacji
- wartość zmiennej – w przypadku, gdy wartość zmiennej spełnia wymogi
Użycie funkcji filter_input mimo ułatwienia pracy może być niewygodne w przypadku, gdy chcemy przefiltrować większą ilość zmiennych np. pobranych za pośrednictwem formularza. W takim przypadku z pomocą przychodzi funkcja filter_input_array. Pobiera ona na wejściu tablicę zawierającą zestawienie zmiennych oraz opisujących je argumentów.
<?php $args = array( 'login' => FILTER_SANITIZE_STRING, 'email' => FILTER_VALIDATE_EMAIL, 'url' => FILTER_VALIDATE_URL, 'wiek' => array( 'filter' => FILTER_VALIDATE_INT, 'options' => array( 'min_range' => 18, 'max_range' => 80 ) ), 'kod-pocz' => array( 'filter' => FILTER_VALIDATE_REGEXP, 'options' => array( 'regexp' => '#\d{2}-\d{3}#' ) ), 'brakujaca' => FILTER_VALIDATE_IP ); $data = filter_input_array( INPUT_POST, $args ); var_dump( $data ); ?>
W wyniku działania powyższej funkcji otrzymujemy tablicę z przefiltrowanymi i zwalidowanymi danymi.
Mimo istnienia wielu filtrów oraz flag poszczególnych filtrów osobiście brakuje mi możliwości określenia długości tekstu. Niedogodność tą możemy obejść poprzez skorzystanie z filtra FILTER_CALLBACK oraz stworzenie odpowiedniej funkcji.
Podczas korzystania z funkcji filter_* należy pamiętać, że dane na których operują są kopią zmiennych superglobalnych, a nie referencją do nich. Tak więc edycja zmiennych superglobalnych wewnątrz skryptu nie będzie miała odwzorowania w danych zwracanych przez funkcje filter_*.
<?php $_POST['login'] = 'Beldzio'; var_dump( $_POST['login'] ); // Beldzio var_dump( filter_input( INPUT_POST, 'login' ) ); // null ?>
Warto zobaczyć:
Tagi: filtracja, filtry, walidacja
Kategoria: Bezpieczeństwo, PHP
Poczułem się głupio… w php programuje od dobrych paru lat, a tej funkcji nie znałem :/ Dzięki za uświadomienie istnienia teg tworu ;)
polecam się na przyszłość :-)
chyba te filtry sa skutecznie przeciw ataku XSS, SQL INjectiona ?
jeśli zostaną poprawnie użyte to przyczynią się do zabezpieczenia aplikacji