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

    ?>