Filtrowanie i czyszczenie danych w PHP za pomocą filter_var

Treść dodana: 20 stycznia 2016.

Język PHP oferuje od pewnego czasu funkcje filtrujące i walidujące, które z powodzeniem sprawdzą się przy prostych zadaniach oczyszczania niebezpiecznych danych.

Filtry dzielą się na dwie grupy. Sprawdzające (validate filters) – ich celem jest sprawdzenie czy wejściowy ciąg znaków spełnia pewne założenia. Zaliczają się do nich, zgodnie z dokumentacją:

  • FILTER_VALIDATE_BOOLEAN
  • FILTER_VALIDATE_EMAIL
  • FILTER_VALIDATE_FLOAT
  • FILTER_VALIDATE_INT
  • FILTER_VALIDATE_IP
  • FILTER_VALIDATE_REGEXP
  • FILTER_VALIDATE_MAC
  • FILTER_VALIDATE_URL

Część z filtrów może przyjmować dodatkowe opcje, jak np. FILTER_VALIDATE_INT zakres liczb spełniających kryteria.

Drugą grupę stanowią filtry czyszczące (sanitize filters). Mają one za zadanie usunąć z ciągu wejściowego niepożądane znaki.

  • FILTER_SANITIZE_EMAIL
  • FILTER_SANITIZE_ENCODED
  • FILTER_SANITIZE_MAGIC_QUOTES
  • FILTER_SANITIZE_NUMBER_FLOAT
  • FILTER_SANITIZE_NUMBER_INT
  • FILTER_SANITIZE_SPECIAL_CHARS
  • FILTER_SANITIZE_FULL_SPECIAL_CHARS
  • FILTER_SANITIZE_STRING
  • FILTER_SANITIZE_STRIPPED
  • FILTER_SANITIZE_URL
  • FILTER_UNSAFE_RAW

Oprócz wcześniej wymieniony występuje jeszcze jedna specjalna grupa – FILTER_CALLBACK. Jest to filtr, który jako opcję przyjmuje poprawny “callback” czyli na przykład funkcję, albo klasę z metodą __invoke(). Może on posłużyć do zawarcia bardziej zaawansowanej logiki, łączącej kilka różnych filtrów lub innych metod sprawdzających.

Zastosowanie filtrów

W zależności od tego, czy chcemy przefiltrować pojedynczą zmienną, własną tablicę, czy też jedną ze zmiennych globalnych (jak $_POST, $_GET), potrzebna nam będzie któraś z funkcji wymienionych w dokumentacji filtrów. Do przefiltrowania pojedynczej zmiennej posłużymy się funkcją filter_var() która przyjmuje postać:

mixed filter_var ( mixed $variable [, int $filter = FILTER_DEFAULT [, mixed $options ]] )

Funkcja zwraca odfiltrowany ciąg znaków, lub `false` w przypadku pojawienia się błędu.

Przykładowo, aby sprawdzić poprawność adresu e-mail:

<?php
$email = 'jan.kowalski@gmail.com';
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo 'Adres jest prawidłowy';
}

Warto tu wspomnieć, iż filtr nie sprawdza znaków narodowych więc adres `jan.wiśniewski@gmail.com` będzie rozumiany jako nieprawidłowy. Aby to naprawić, należy przekonwertować znaki za pomocą funkcji idn_to_ascii.

Do sprawdzenia zakresu liczb wykorzystamy filtr FILTER_VALIDATE_INT:

<?php
$i = 6;
$options = [
    'options' => [
        'min_range' => 1,
        'max_range' => 6,
    ]
];
echo (filter_var($i, FILTER_VALIDATE_INT, $options) !== FALSE) ? 'Prawidłowa' : 'Nieprawidłowa';

Z kolei filtr czyszczący działa w następujący sposób:

<?php
$email = '<jan.kowalski@gmail.com>';
var_dump(filter_var($email, FILTER_SANITIZE_EMAIL));
// string(22) "jan.kowalski@gmail.com"
<?php
$text = 'lorem ipsum dolor <>"\'&^ sit amet';
var_dump(filter_var($text, FILTER_SANITIZE_FULL_SPECIAL_CHARS));
// string(53) "lorem ipsum dolor &lt;&gt;&quot;&#039;&amp;^ sit amet"

Podsumowanie

Chociaż filtry są jeszcze dość ubogie, brakuje też funkcji odpowiedzialnej za łączenie wielu filtrów (osobiście ucieszyłbym się gdyby powstała natywna klasa filtrująca), to jednak są dużo lepszym wyborem niż samodzielnie pisane, bardzo często niepoprawne reguły walidacji (np. w dalszym ciągu popularne skrypty w sieci walidujące email, ograniczają długość domeny od 2 do 4 znaków – podczas gdy poprawne są domeny typu travel, christmas, futbol). Osoba zaczynająca naukę PHP powinna wiedzieć, że jest taka możliwość i z niej korzystać.

Komentarze

Nie ma jeszcze żadnych komentarzy do wyświetlenia. Może chcesz zostać pierwszą osobą która podzieli się swoją opinią?

Dodaj komentarz

*
Nazwa zostanie wyświetlona wraz z komentarzem. Możesz też utworzyć nowe konto w serwisie, dzięki czemu uzyskasz dodatkową funkcjonalność.
*
Akceptowana jest ograniczona składnia Textile. Wszystkie tagi HTML zostaną usunięte.