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_inputINPUT_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_arrayINPUT_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_dumpfilter_inputINPUT_POST'login' ) ); // null

?>

Warto zobaczyć:

Komentarze

  1. Brak komentarzy.

Skomentuj

Dozwolone tagi: a, strong, em, code, blockquote

Nick (wymagany)

E-mail (na potrzeby graviatar'a):

Jesteś botem?

Komentarz: