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