5.2. Zend_Filter_Input
Terug | Hoofdstuk 5. Zend_Filter | Volgende

## 5.2. Zend_Filter_Input

### 5.2.1. Inleiding

`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.

### 5.2.1.1. Witte lijst filteren

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 */
        }

        ?>

### 5.2.1.2. Blind Filteren

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'; */

        ?>

### 5.2.1.3. Zwarte lijst Filteren

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!'; */

        ?>

### 5.2.2. Werkingstheorie

`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.

### 5.2.3. Gebruik

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');

        ?>

Terug | Omhoog | Volgende
Hoofdstuk 5. Zend_Filter | Begin | Hoofdstuk 6. Zend_Http