11.4. Zend_Filter_Input

11.4.1. Wprowadzenie

Klasa Zend_Filter_Input dostarcza metody, które zapewniają uporządkowane podejście do filtrowania danych przychodzących. Jej przeznaczenie jest różnorodne, ponieważ zaspokaja ona potrzeby trzech różnych grup ludzi:

  • Programiści

    Chociaż filtrowanie danych wejściowych nigdy nie może być tak łatwe jak nierobienie niczego, programiści potrzebują zapewnić integralną czystość swoim danym nie dodając w tym celu niepotrzebnej złożoności kodu.

  • Menadżerzy

    Menadżerzy którzy chcą zachować kontrolę nad dużą grupą programistów mogą narzucić gotowy sposób filtrowania danych wejściowych, a także mogą wyeliminować dostęp to niefiltrowanych danych wejściowych.

  • Audytorzy

    Ci, którzy sprawdzają kod aplikacji potrzebują szybko i solidnie sprawdzić kiedy i gdzie używane są dane wejściowe w czystej postaci. Zasady, które sprzyjają pisaniu przejrzystego kodu wspierają także audytorów zapewniając im jasne odróżnienie pomiędzy różnymi sposobami filtrowania danych wejściowych.

Jest wiele różnych zdań na temat filtrowania danych przychodzących i jest wiele różnych metod, których programiści mogą użyć. Filtrowanie whitelist, filtrowanie blacklist, wyrażenia regularne, wyrażenia warunkowe oraz natywne funkcje PHP są tylko kilkoma przykładami filtrowania danych przychodzących.

11.4.2. Opis działania

W celu zapewnienia uporządkowanego dostępu do filtrowania danych wejściowych, domyślnie Zend_Filter_Input próbuje forsować kontrolowany dostęp do danych wejściowych ustawiając wartość źródłowej tablicy na null.

W podejściu domyślnym (ścisłym), do konstruktora przekazywany jest jeden argument - tablica danych do filtrowania. Niefiltrowane dane są dostępnę tylko za pomocą metody getRaw():

<?php
// $_POST['email'] === 'webmaster@example.com'

// Filtruje dane z tablicy $_POST
require_once 'Zend/Filter/Input.php';
$filterPost = new Zend_Filter_Input($_POST);

// $_POST ma teraz wartość null
echo null === $_POST ? 'yes' : 'no'; // wyświetla 'yes'

// Pobiera niefiltrowaną wartość e-mail
echo $filterPost->getRaw('email'); // wyświetla 'webmaster@example.com'

Zend_Filter_Input ustawia wartość przekazanej tablicy ($_POST) na null, więc bezpośredni do niej dostęp nie jest już możliwy. (Dane niefiltrowane są wciąż dostępne za pomocą metody getRaw(), która jest łatwiejsza do monitorowania)

W podejściu opcjnalnym (nieścisłym), wartość false jest przekazywana jako drugi argument do konstruktora:

<?php
// $_POST['email'] === 'webmaster@example.com'

// Filtruje dane z tablicy $_POST
require_once 'Zend/Filter/Input.php';
$filterPost = new Zend_Filter_Input($_POST, false);

// tablica $_POST wciąż jest zdefiniowana
echo null === $_POST ? 'yes' : 'no'; // wyświetla 'no'

// Pobiera niefiltrowaną wartość e-mail
echo $filterPost->getRaw('email'); // wyświetla 'webmaster@example.com'

Użycie filtra jest dokładnie takie same, ale Zend_Filter_Input nie ustawia wartości oryginalnej tablicy ($_POST) na null, więc programiści wciąż mają do niej bezpośredni dostęp. Te podejście jest odradzane na rzecz podejścia ścisłego.

Zend_Filter_Input jest zaprojektowany do pracy z tablicami. Wiele źródeł danych wejścioywych jest oparta na superglobalnych tablicach PHP ($_GET, $_POST, $_COOKIE, itp.), a tablice są główną konstrukcją używaną do przechowywania danych wejściowych z innych źródeł. Jeśli potrzebujesz filtrować dane skalarne, zobacz Rozdział 11, Zend_Filter.