Filtrowanie (Filter) PHP

Filtry PHP są używane do weryfikacji i filtrowania danych pochodzących z niezabezpieczonych źródeł, takich jak dane wejściowe użytkowników.

Co to są filtry PHP?

Filtry PHP są używane do weryfikacji i filtrowania danych pochodzących z niezabezpieczonych źródeł.

Weryfikacja i filtrowanie danych wejściowych użytkowników lub danych niestandardowych jest istotnym elementem każdej aplikacji internetowej.

Celem projektowania rozszerzenia filtrów PHP jest ułatwienie i przyspieszenie procesu filtrowania danych.

Dlaczego używać filtrów?

Prawie wszystkie aplikacje internetowe zależą od zewnętrznych danych wejściowych. Te dane zwykle pochodzą od użytkowników lub innych aplikacji (np. usług internetowych). Dzięki użyciu filtrów możesz upewnić się, że aplikacja otrzymuje poprawny typ danych wejściowych.

Zawsze filtrowaj dane zewnętrzne!

Filtrowanie wejścia jest jednym z najważniejszych tematów bezpieczeństwa aplikacji.

Co to jest dane zewnętrzne?

  • Dane wejściowe z formularza
  • Ciasteczka
  • Zmienne serwera
  • Wynik zapytania do bazy danych

Funkcje i filtry

Aby filtrować zmienne, użyj jednej z poniższych funkcji filtrów:

  • filter_var() - Filtrowanie pojedynczej zmiennej przez określony filtr
  • filter_var_array() - Filtrowanie wielu zmiennych przez te same lub różne filtry
  • filter_input - Pobieranie jednej zmiennej wejściowej i filtrowanie jej
  • filter_input_array - Pobieranie wielu zmiennych wejściowych i filtrowanie ich za pomocą tych samych lub różnych filtrów

W poniższym przykładzie użyliśmy funkcji filter_var() do weryfikacji liczby całkowitej:

<?php
$int = 123;
if(!filter_var($int, FILTER_VALIDATE_INT))
 {
 echo("Integer is not valid");
 }
else
 {
 echo("Integer is valid");
 }
?>

Powyższy kod używa filtra "FILTER_VALIDATE_INT" do filtrowania zmiennej. Ponieważ liczba całkowita jest legalna, wynik kodu to: "Integer is valid".

Jeśli spróbujemy użyć zmiennej nieliczbowej, wynik będzie: "Integer is not valid".

Aby uzyskać pełną listę funkcji i filtrów, odwiedź naszą Przeglądarka PHP Filter.

Validating i Sanitizing

Istnieją dwa filtry:

Filtrowanie Validating:

  • Używane do weryfikacji wprowadzania użytkownika
  • Ścisłe reguły formatu (np. weryfikacja URL lub e-mail)
  • Zwraca oczekiwany typ, jeśli jest sukcesem, w przeciwnym razie zwraca FALSE

Filtrowanie Sanitizing:

  • Używane do zezwolenia lub zabrania określonych znaków w ciągu znaków
  • Brak reguł formatu danych
  • Zawsze zwraca ciąg znaków

Opcje i flagi

Opcje i flagi służą do dodania dodatkowych opcji filtracji do określonego filtra.

Różne filtry mają różne opcje i flagi.

W poniższym przykładzie użyliśmy funkcji filter_var() oraz opcji "min_range" i "max_range", aby zweryfikować liczbę całkowitą:

<?php
$var=300;
$int_options = array(
"options"=>array
 (
 "min_range"=>0,
 "max_range"=>256
 )
);
if(!filter_var($var, FILTER_VALIDATE_INT, $int_options))
 {
 echo("Integer is not valid");
 }
else
 {
 echo("Integer is valid");
 }
?>

Jak w powyższym kodzie, opcje muszą być umieszczone w związku z tablicą o nazwie "options". Jeśli używasz znaków, nie musisz umieszczać ich w tablicy.

Jako że liczba całkowita wynosi "300", nie jest w zdefiniowanym zakresie, wyjście kodu będzie "Integer is not valid".

Aby uzyskać pełną listę funkcji i filtrów, odwiedź Przeglądarka PHP FilterMożesz zobaczyć dostępne opcje i znaki każdego filtra.

Weryfikacja danych

Spróbujmy zweryfikować dane przysyłane z formularza.

Pierwszą rzeczą, którą musimy zrobić, to potwierdzić, że istnieją dane wejściowe, które szukamy.

Następnie użyj funkcji filter_input() do przefiltrowania danych wejściowych.

W poniższym przykładzie zmienna wejściowa "email" jest przesyłana do strony PHP:

<?php
if(!filter_has_var(INPUT_GET, "email"))
 {
 echo("Typ wejścia nie istnieje");
 }
else
 {
 if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL))
  {
  echo "E-Mail nie jest ważny";
  }
 else
  {
  echo "E-Mail jest ważny";
  }
 }
?>

Wyjaśnienie przykładu:

W powyższym przykładzie istnieje zmienna wejściowa (email) przesyłana metodą "GET":

  1. Sprawdź, czy istnieje zmienna wejściowa "email" typu "GET"
  2. Jeśli istnieje zmienna wejściowa, sprawdź, czy jest to ważny adres e-mail

Oczyszczenie danych wejściowych

Spróbujmy wyczyścić URL przysyłany z formularza.

Najpierw upewnijmy się, że istnieją dane wejściowe, które szukamy.

Następnie użyj funkcji filter_input() do oczyszczenia danych wejściowych.

W poniższym przykładzie zmienna wejściowa "url" jest przesyłana do strony PHP:

<?php
if(!filter_has_var(INPUT_POST, "url"))
 {
 echo("Typ wejścia nie istnieje");
 }
else
 {
 $url = filter_input(INPUT_POST, "url", FILTER_SANITIZE_URL);
 }
?>

Wyjaśnienie przykładu:

W powyższym przykładzie istnieje zmienna wejściowa (url) przesyłana metodą "POST":

  1. Sprawdź, czy istnieje zmienna wejściowa "url" typu "POST"
  2. Jeśli istnieje taka zmienna wejściowa, oczyszcz ją (usuń nielegalne znaki) i zapisz w zmiennej $url

Jeśli zmienna wejściowa wygląda podobnie: "http://www.W3非o法ol.com.c字符n/", to oczyszczona zmienna $url powinna wyglądać tak:

http://www.codew3c.com/

Filtrowanie wielu wejść

Formularze są zazwyczaj złożone z wielu pól wejściowych. Aby uniknąć powtarzania wywołań filter_var lub filter_input, możemy użyć funkcji filter_var_array lub filter_input_array.

W tym przykładzie używamy funkcji filter_input_array() do filtrowania trzech zmiennych GET. Otrzymane zmienne GET to nazwa, wiek oraz adres e-mail:

<?php
$filters = array
 (
 "name" => array
  (
  "filter"=>FILTER_SANITIZE_STRING
  ),
 "age" => array
  (
  "filter"=>FILTER_VALIDATE_INT,
  "options"=>array
   (
   "min_range"=>1,
   "max_range"=>120
   )
  ),
 "email"=> FILTER_VALIDATE_EMAIL,
 );
$result = filter_input_array(INPUT_GET, $filters);
if (!$result["age"])
 {
 echo("Age must be a number between 1 and 120.<br />");
 }
elseif(!$result["email"])
 {
 echo("E-Mail is not valid.<br />");
 }
else
 {
 echo("User input is valid");
 }
?>

Wyjaśnienie przykładu:

W powyższym przykładzie są trzy zmienne wejściowe przesyłane metodą "GET" (name, age i email)

  1. Ustaw tablicę, która zawiera nazwy zmiennych wejściowych oraz filtry używane do określonych zmiennych wejściowych
  2. Wywołaj funkcję filter_input_array(), parametry obejmują zmienne wejściowe GET oraz ustawioną tablicę
  3. Sprawdź, czy zmienne "age" i "email" w zmiennej $result mają nielegalne wejścia. (Jeśli istnieją nielegalne wejścia,)

Drugi parametr funkcji filter_input_array() może być tablicą lub pojedynczym ID filtra.

Jeśli parametr jest ID pojedynczego filtra, to ten określony filtr będzie filtrował wszystkie wartości z wejściowej tablicy.

Jeśli parametr jest tablicą, to ta tablica musi zgodować się z poniższymi zasadami:

  • Musisz to być tablica asocjacyjna, w której zmiennymi wejściowymi są klucze tablicy (np. zmienna wejściowa "age")
  • Wartości tego tablicy muszą być ID filtrów lub tablicami określającymi filtry, znaki oraz opcje

Użycie Filter Callback

Dzięki użyciu filtru FILTER_CALLBACK można wywołać niestandardową funkcję jako filtr. W ten sposób mamy pełną kontrolę nad filtrowaniem danych.

Możesz stworzyć własną funkcję niestandardową lub użyć istniejącej funkcji PHP.

Zasady określania metod używanych przez funkcje filtrujące są takie same jak zasady określania opcji.

W poniższym przykładzie użyliśmy własnej funkcji, aby zamienić wszystkie "_" na spację:

<?php
function convertSpace($string)
{
return str_replace("_", " ", $string);
}
$string = "Peter_is_a_great_guy!";
echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace"));
?>

Wynik powyższego kodu wygląda tak:

Peter to wspaniały facet!

Wyjaśnienie przykładu:

Powyższy przykład zamienia wszystkie "_" na spację:

  1. Utwórz funkcję, która zamienia "_" na spację
  2. Wywołaj funkcję filter_var(), jej parametrem jest filtr FILTER_CALLBACK oraz tablica zawierająca naszą funkcję