Zend_Filter_Input
verstrekt faciliteiten die een
gestructureerd en weinig soepele benadering van invoerfilteren mogelijk maken. Het doel
is veelvoudig want het beantwoord aan de benodigdheden van drie verschillende
groepen van mensen:
Ontwikkelaars
Hoewel invoerfilteren nooit zo gemakkelijk kan zijn als
niets doen moeten ontwikkelaar de integriteit van hun data
garanderen zonder hun code onnodig complex te maken.
Zend_Filter_Input
biedt een eenvoudige methode
voor de meest voorkomende gevallen, uitbreidbaarheid voor
grensgevallen, en een strikte benamingsovereenkomst die de duidelijkheid
van de code bevordert.
Managers
Alle managers die controle over een grote groep ontwikkelaars moeten houden kunnen een gestructereerde benadering voor invoerfilteren opleggen door toegang tot rauwe invoer te beperken of te verbieden.
Auditeurs
Zij die de code van een toepassing auditeren moeten snel en betrouwbaar kunnen identificeren wanneer en waar rauwe invoer wordt gebruikt door een ontwikkelaar. De karakteristieken die codeklaarheid bevorderen helpen ook auditeurs door een duidelijk verschil te maken tussen de verschillende benaderingen voor invoerfilteren.
Er bestaat een grote variëteit in de benadering van invoerfilteren, en er
bestaan ook vele verschillende faciliteiten die een PHP ontwikkelaar kan
gebruiken. Witte lijst filteren, zwarte lijst filteren, regular expressions,
voorwaardelijke verklaringen, en ingebouwde PHP functies zijn maar enkele
voorbeelden van de invoerfilter potpourri.
Zend_Filter_Input
combineert al deze mogelijkheden in een enkele API met verenigd gedrag en strikte
benamingsovereenkomsten. Alle methodes luisteren naar een eenvoudige regel - als
de data geldig is, wordt ze teruggestuurd, zo niet wordt FALSE
teruggestuurd. Extreme simpliciteit.
Witte lijst filtermethodes beginnen met de is
prefix, zoals isAlpha()
en isEmail()
.
Deze methodes inspecteren invoer aan de hand van vooraf gedefinieerde criteria
en geven de data alleen terug indien ze aan de criteria voldoet. Is dit niet het geval, dan wordt
FALSE
teruggestuurd. Hier volgt een voorbeeld:
<?php $filterPost = new Zend_Filter_Input($_POST); if ($alphaName = $filterPost->isAlpha('name')) { /* $alphaName bevat alleen alfabetische tekens. */ } else { /* $alphaName wordt als False geëvalueerd. */ } ?>
Deze aanpak is losjes door het feit dat ze een boolean
evaluatie doet op de teruggekeerde waarde. Indien je waarden die
mogelijk tot FALSE
evalueren moet onderscheiden
(zoals de integer 0
en de lege string), kan je een
strikte vergelijking met FALSE
doen:
<?php $filterPost = new Zend_Filter_Input($_POST); $alphaName = $filterPost->isAlpha('name'); if ($alphaName !== FALSE) { /* $alphaName bevat alleen alfabetische tekens. */ } else { /* $alphaName === FALSE */ } ?>
Blinde filtermethodes beginnen met de get
prefix, zoals getAlpha()
en getDigits()
.
Deze methodes inspecteren de invoer niet maar geven in plaats daarvan
alleen het deel van de invoer terug die als geldig wordt beschouwd.
getAlpha()
bijvoorbeeld, geeft alleen alfabetische
tekens terug indien die er zijn. (Zoniet is de overblijvende string leeg.)
Hier volgt een voorbeeld:
<?php /* $_POST['username'] = 'John123Doe'; */ $filterPost = new Zend_Filter_Input($_POST); $alphaUsername = $filterPost->getAlpha('username'); /* $alphaUsername = 'JohnDoe'; */ ?>
Zwarte lijst filtermethodes beginnen met de no
prefix, zoals noTags()
en
noPath()
. Deze methodes zijn gelijk aan de blinde
filtermethodes, behalve dat de filtercriteria gebaseerd zijn op
wat beschouwd wordt als ongeldige data in plaats van geldige data. Ongeldige
data wordt verwijderd, en de overblijvende data (verondersteld geldig te zijn)
wordt teruggestuurd. Hier volgt een eenvoudig voorbeeld:
<?php /* $_POST['comment'] = '<b>Ik hou van PHP!</b>'; */ $filterPost = new Zend_Filter_Input($_POST); $taglessComment = $filterPost->noTags('comment'); /* $taglessComment = 'Ik hou van PHP!'; */ ?>
Zend_Filter_Input
consolideert een paar verschillende
benaderingen voor invoer filteren in een enkele API met een verenigd gedrag
en strikte benamingsovereenkomsten (zie
Paragraaf 5.2.1, “Inleiding”). Deze eigenschappen brengen
Zend_Filter_Input
op gelijke voet met bestaande oplossingen,
maar ze doen niets om diegenen die een meer gestructureerde en strikte aanbreng
nodig hebben te helpen. Daarom versterkt Zend_Filter_Input
controle voor toegang tot invoer.
Twee syntaxen worden ondersteund. In de (strikte) standaard benadering wordt er slechts één enkel argument aan de constructor doorgegeven - de array die gefilterd moet worden::
<?php $filterPost = new Zend_Filter_Input($_POST); $email = $filterPost->isEmail('email'); ?>
Zend_Filter_Input
zet de doorgegeven array
($_POST
) tot NULL
, zodat onmiddellijke toegang
niet langer mogelijk is. (De rauwe data is alleen voorhanden via de getRaw()
methode, die gemakkelijker te monitoren en/of te vermijden is.)
In de optionele (niet strikte) benadering wordt FALSE
als
het tweede argument aan de constructor doorgegeven:
<?php $filterPost = new Zend_Filter_Input($_POST, FALSE); $email = $filterPost->isEmail('email'); ?>
Het gebruik van het filter is identiek, maar Zend_Filter_Input
zet de oorspronkelijke array ($_POST
) niet naar NULL
,
zodat ontwikkelaars er nog directe toegang toe hebben. Deze manier van werken is
afgeraden ten voordele van de strikte benadering.
Zend_Filter_Input
is ontworpen voor arrays. Veel invoerbronnen
zijn reeds in PHP's superglobal arrays ($_GET
, $_POST
,
$_COOKIE
, etc.) gegoten, en een array is een welgekend concept om
invoer van andere bronnen op te slaan. Indien je een scalaire waarde moet filteren, zie
Hoofdstuk 5, Zend_Filter.
Strikt Witte Lijst Filteren (Voorkeur):
<?php $filterPost = new Zend_Filter_Input($_POST); if ($email = $filterPost->isEmail('email')) { /* $email is een geldig email formaat. */ } else { /* $email is geen geldig email formaat. */ } ?>
Strikt Blind Filteren:
<?php $filterPost = new Zend_Filter_Input($_POST); $alphaName = $filterPost->getAlpha('name'); ?>
Strikt Zwarte Lijst Filteren:
<?php $filterPost = new Zend_Filter_Input($_POST); $taglessComment = $filterPost->noTags('comment'); ?>
Niet-Strikt Witte Lijst Filteren:
<?php $filterPost = new Zend_Filter_Input($_POST, FALSE); if ($email = $filterPost->isEmail('email')) { /* $email is een geldig email formaat. */ } else { /* $email is geen geldig email formaat. */ } ?>
Niet Strikt Blind Filteren:
<?php $filterPost = new Zend_Filter_Input($_POST, FALSE); $name = $filterPost->getAlpha('name'); ?>
Niet Strikt Zwarte Lijst Filteren:
<?php $filterPost = new Zend_Filter_Input($_POST, FALSE); $comment = $filterPost->noTags('comment'); ?>