Zend_Filter_Input
dostarcza proste metody,
które zapewniają poważne potraktowanie 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.
Zend_Filter_Input
oferuje proste metody, które
mogą być użyte w większości przypadków, przy zachowaniu sporej
elastyczności w przypadkach skrajnych. Metody mają określone ścisłe
konwencje nazewnictwa co sprzyja pisaniu przejrzystego 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. Zend_Filter_Input
łączy
te metody w jedno API o jednolitym działaniu oraz o sztywnych
konwencjach nazewnictwa. Wszystkie metody działają według prostej zasady
- jeśli dane są prawidłowe, są one zwracane, w przeciwnym wypadku zwracana
jest wartość FALSE
. Jest to maksymalnie proste.
Metody filtrowania whitelist poprzedzone są przedrostkiem
test
, na przykład testAlpha()
czy
testEmail()
. Te metody sprawdzają dane według
zdefiniowanych kryteriów i zwracają dane tylko wtedy gdy są zgodne.
Jeśli nie są, zwracana jest wartość FALSE
. Oto
prosty przykład:
<?php $filterPost = new Zend_Filter_Input($_POST); if ($alphaName = $filterPost->testAlpha('name')) { /* $alphaName zawiera tylko litery. */ } else { /* $alphaName ma wartość FALSE. */ } ?>
To powoduje wystąpienie błędu podczas zamiany zwróconej
przefiltrowanej wartości na wartość logiczną. Jeśli chcesz porównać
wartości, które w PHP zostają zamienione na wartość FALSE
(na przykład liczba 0
czy pusty łańcuch znaków),
możesz przeprowadzić ścisłe porównanie z FALSE
:
<?php $filterPost = new Zend_Filter_Input($_POST); $alphaName = $filterPost->testAlpha('name'); if ($alphaName !== FALSE) { /* $alphaName zawiera tylko litery. */ } else { /* $alphaName === FALSE */ } ?>
Metody filtrowania blind poprzedzone są przedrostkiem
get
, na przykład getAlpha()
czy
getDigits()
. Te metody nie sprawdzają danych, natomiast
zwracają tylko te części które spełniają kryteria. Na przykład metoda
getAlpha()
zwraca tylko litery, jeśli jakieś istnieją
w filtrowannych danych. (Jeśli nie istnieją zwracany jest pusty łańcuch.)
Oto prosty przykład:
<?php /* $_POST['username'] = 'John123Doe'; */ $filterPost = new Zend_Filter_Input($_POST); $alphaUsername = $filterPost->getAlpha('username'); /* $alphaUsername = 'JohnDoe'; */ ?>
Metody filtrowania blacklist poprzedzone są przedrostkiem
no
, na przykład noTags()
czy
noPath()
. Te metody działają identycznie jak metody
blind, z wyjątkiem tego, że tutaj kryteria mówią o tym jakie dane są
nieprawidłowe, a nie o tym jakie są prawidłowe. Dane nieprawidłowe
są usuwane, a pozostałe dane (uznane za prawidłowe) są zwracane. Oto
prosty przykład:
<?php /* $_POST['comment'] = '<b>Kocham PHP!</b>'; */ $filterPost = new Zend_Filter_Input($_POST); $taglessComment = $filterPost->noTags('comment'); /* $taglessComment = 'Kocham PHP!'; */ ?>
Zend_Filter_Input
łączy kilka różnych podejść do
filtrowania danych przychodzących w jedno API o jednolitym działaniu oraz
o sztywnych konwencjach nazewnictwa. (zobacz Sekcja 7.2.1, „Wprowadzenie”).
Obsługiwane są dwa typy składni. W domyślnym sposobie do konstruktora przekazywany jest pojedynczy argument - tablica która ma być filtrowana:
<?php $filterPost = new Zend_Filter_Input($_POST); $email = $filterPost->testEmail('email'); ?>
Zend_Filter_Input
zmienia wartość tablicy, która
została przekazana ($_POST
) na NULL
,
więc bezpośredni dostęp do niej nie jest już możliwy. (Dostęp do niefiltrowanych
danych jest jedynie możliwe za pomocą metody getRaw()
,
która jest dużo łatwiejsza do kontrolowania)
W sposobie opcjonalnym, wartość FALSE
jest przekazywana jako drugi argument do konstruktora:
<?php $filterPost = new Zend_Filter_Input($_POST, FALSE); $email = $filterPost->testEmail('email'); ?>
Użycie filtra jest identyczne, ale Zend_Filter_Input
nie ustawia wartości oryginalnej tablicy ($_POST
) na
NULL
, więc dalej jest możliwy bezpośredni dostęp do danych.
Ten sposób nie jest polecany, polecany jest sposób pierwszy.
Zend_Filter_Input
jest zaprojektowany głównie w celu
filtrowania tablic. Duża część danych wejściowych pochodzi z superglobalnych
tablic PHP ($_GET
, $_POST
,
$_COOKIE
, itp.), a tablice także są najczęstszą strukturą
używaną do przechowywania danych wejściowych pochodzących z innych źródeł.
Jeśli potrzebujesz filtrować wartości skalarne (nietablicowe) zobacz
Rozdział 7, Zend_Filter.
Ścisłe filtrowanie whitelist (preferowane):
<?php $filterPost = new Zend_Filter_Input($_POST); if ($email = $filterPost->testEmail('email')) { /* $email jest prawidłowym adresem email. */ } else { /* $email nie jest prawidłowym adresem email. */ } ?>
Ścisłe filtrowanie blind:
<?php $filterPost = new Zend_Filter_Input($_POST); $alphaName = $filterPost->getAlpha('name'); ?>
Ścisłe filtrowanie blacklist:
<?php $filterPost = new Zend_Filter_Input($_POST); $taglessComment = $filterPost->noTags('comment'); ?>
Nieścisłe filtrowanie whitelist:
<?php $filterPost = new Zend_Filter_Input($_POST, FALSE); if ($email = $filterPost->testEmail('email')) { /* $email jest prawidłowym adresem email. */ } else { /* $email nie jest prawidłowym adresem email. */ } ?>
Nieścisłe filtrowanie blind:
<?php $filterPost = new Zend_Filter_Input($_POST, FALSE); $name = $filterPost->getAlpha('name'); ?>
Nieścisłe filtrowanie blacklist:
<?php $filterPost = new Zend_Filter_Input($_POST, FALSE); $comment = $filterPost->noTags('comment'); ?>