Aplikacje internetowe

Bełdziowe spojrzenie na aplikacje internetowe

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: , ,
Kategoria: Bezpieczeństwo, PHP


4 komentarze

  1. Bru2s napisał(a):

    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 ;)

  2. polecam się na przyszłość :-)

  3. Machei napisał(a):

    chyba te filtry sa skutecznie przeciw ataku XSS, SQL INjectiona ?

  4. jeśli zostaną poprawnie użyte to przyczynią się do zabezpieczenia aplikacji

Dodaj komentarz