7.2. Zend_Filter_Input

7.2.1. Einführung

Zend_Filter_Input stellt einfache Möglichkeiten für eine strukturierte und rigide Methode der Eingabefilterung bereit. Die Gründe sind vielfältig, da sie auf die Bedürfnisse von drei unterschiedlichen Gruppen von Leuten zugeschnitten sind:

  • Entwickler

    Obwohl das Filtern von Eingaben niemals so einfach sein kann, wie gar nichts zu tun, sollten Entwickler die Integrität ihrer Daten sicherstellen, ohne das dem Code unnötige Komplexität hinzugefügt werden muss. Zend_Filter_Input bietet einfache Methoden für die häufigsten Anwendungsfälle, Erweiterbarkeit für die Basisklassen und einen strikte Namenskonvention, die klaren Code fördert.

  • Manager

    Manager jedweder Art, welche die Kontrolle über eine grosse Gruppe von Entwicklern behalten möchten, können eine strukturierte Vorgehensweise für das Filtern von Eingaben durchsetzen, indem der Zugriff auf unbearbeitete Eingabedaten beschränkt oder ausgeschlossen wird.

  • Prüfer

    Jene, welche den Code der Anwendung prüfen, müssen schnell und verlässlich erkennen können, wann und wo unbearbeitete Eingabedaten von Entwicklern verwendet werden. Die Charakteristika, die klaren Code fördern, unterstützen Prüfer ebenfalls durch die Bereitstellung von klarer Unterscheidung zwischen den unterschiedlichen Vorgehensweisen, um Eingaben zu filtern.

Es gibt eine Vielzahl von Vorgehensweisen für die Prüfung von Eingaben und es gibt auch eine Vielzahl von Ansätzen, die PHP Entwickler verwenden können. Whitelist Filtern, Blacklist Filtern, reguläre Ausdrücke, bedingte Anweisungen und native PHP Funktionen sind nur einige Beispiele des Potpourri für das Filtern von Eingaben. Zend_Filter_Input kombiniert alle diese Ansätze in einer einzigen API mit einheitlichem Verhalten und strikten Namenskonventionen. Alle diese Methoden befolgen eine einfach Regel - wenn die Daten gültig sind, werden sie zurückgegeben, andernfalls wird FALSE zurückgegeben. Extreme Einfachheit.

7.2.1.1. Whitelist Filtern

Die Methoden für das Whitelist Filtern beginnen mit dem Präfix test, wie zum Beispiel testAlpha() und testEmail(). Diese Methoden prüfen die Eingabe gemäß der vordefinierten Kriterien und geben die Daten nur zurück, wenn sie die Kriterien befolgen. Falls nicht wird FALSE zurückgegeben. Das folgende Beispiel zeigt eine einfache Demonstration.

    <?php
    
    $filterPost = new Zend_Filter_Input($_POST);
    
    if ($alphaName = $filterPost->testAlpha('name')) {
        /* $alphaName enthält nur Buchstaben. */
    } else {
        /* $alphaName evaluiert als FALSE. */
    }
    
    ?>
            

Dieser Ansatz verhält sich eher etwas zu vorsichtig durch die Ausführung einer booleschen Bewertung des zurückgegeben Wertes. Wenn du zwischen Werten, die in PHP als FALSE evaluieren (wie zum Beispiel das Integer 0 oder eine leere Zeichenkette) unterscheiden möchtest, kannst du auch einen strikten Vergleich mit FALSE durchführen:

    <?php
    
    $filterPost = new Zend_Filter_Input($_POST);
    $alphaName = $filterPost->testAlpha('name');
    
    if ($alphaName !== FALSE) {
        /* $alphaName enthält nur Buchstaben. */
    } else {
        /* $alphaName === FALSE */
    }
    
    ?>
            

7.2.1.2. Blindes Filtern

Methoden für das Blinde Filtern beginnen mit dem Präfix get, wie zum Beispiel getAlpha() und getDigits(). Diese Methoden prüfen die Eingaben nicht, geben aber stattdessen den Teil zurück, der als gültig erkannt wird. Zum Beispiel gibt getAlpha() nur Buchstaben zurück, wenn es welche gibt. (Falls nicht, ist der verbleibende String ein leerer String.) Das folgende zeigt eine einfache Demonstration:

    <?php
    
    /* $_POST['username'] = 'John123Doe'; */
    
    $filterPost = new Zend_Filter_Input($_POST);
    $alphaUsername = $filterPost->getAlpha('username');
    
    /* $alphaUsername = 'JohnDoe'; */
    
    ?>
            

7.2.1.3. Blacklist Filtern

Die Methoden für das Blacklist Filtern beginnen mit dem Präfix no, wie zum Beispiel noTags() und noPath(). Diese Methoden sind identisch mit den Methoden für das Blinde Filtern, außer dass die Kriterien, die erfüllt werden müssen, darauf basieren, was als ungültig erachtet wird, anstelle dessen, was als gültig erachtet wird. Ungültige Daten werden entfernt und die übrigen Daten (die als gültig angenommen werden) werden zurückgegeben. Es folgt eine einfache Demonstration:

    <?php
    
    /* $_POST['comment'] = '<b>Ich liebe PHP!</b>'; */
    
    $filterPost = new Zend_Filter_Input($_POST);
    $taglessComment = $filterPost->noTags('comment');
    
    /* $taglessComment = 'Ich liebe PHP!'; */
    
    ?>
            

7.2.2. Theoretischer Ablauf

Zend_Filter_Input vereint einige verschiedene Ansätze für das Filtern von Eingaben in einer einzigen API mit einem einheitlichem Verhalten und strikten Namenskonventionen (siehe Abschnitt 7.2.1, „Einführung“). Diese Charakteristika machen Zend_Filter_Input gleichwertig zu vorhandenen Lösungen, aber sie machen nichts, um diese weiter zu unterstützen, die einen strukturierteren oder rigideren Ansatz benötigen. Deshalb setzt Zend_Filter_Input einen kontrollierten Zugriff auf die Eingaben durch.

Zwei Syntax Arten werden unterstützt. In der standardmäßigen (strikten) Vorgehensweise wird ein einziges Argument an den Konstruktur übergeben - das Array, das gefiltert werden soll:

    <?php
    
    $filterPost = new Zend_Filter_Input($_POST);
    $email = $filterPost->testEmail('email');
    
    ?>
        

Zend_Filter_Input setzt das übergebene Array ($_POST) auf NULL, so dass kein direkter Zugriff mehr möglich ist. (Die unbearbeiteten Daten sind nur noch über die getRaw() Methode verfügbar, was alles in allem viel einfacher zu kontrollieren und / oder zu vermeiden ist.)

Bei der optionalen (nicht strikten) Vorgehensweise wird FALSE als zweites Argument an den Konstruktor übergeben:

    <?php
    
    $filterPost = new Zend_Filter_Input($_POST, FALSE);
    $email = $filterPost->testEmail('email');
    
    ?>
        

Die Verwendung des Filters ist genau gleich, außer dass Zend_Filter_Input das ursprüngliche Array ($_POST) nicht auf NULL setzt, so dass Entwickler es weiterhin direkt ansprechen können. Von dieser Vorgehensweise wird zu Gunsten der strikten Vorgehensweise abgeraten.

Zend_Filter_Input wurde primär für Arrays gestaltet. Viele Eingabequellen werden automatisch von den superglobalen PHP Arrays ($_GET, $_POST, $_COOKIE, usw.) abgedeckt und Arrays sind das allgemeine Konstrukt, dass für die Speicherung von Eingaben aus anderen Quellen verwendet wird. Wenn du einen skaleren Wert filtern möchtest, beachte Kapitel 7, Zend_Filter.

7.2.3. Anwendungsfälle

Striktes Whitelist Filtern (Bevorzugt):

    <?php
    
    $filterPost = new Zend_Filter_Input($_POST);
    
    if ($email = $filterPost->testEmail('email')) {
        /* $email ist von einem gültigen E-Mail Format. */
    } else {
        /* $email ist von keinem gültigen E-Mail Format. */
    }
    
    ?>
        

Striktes Blindes Filtern:

    <?php
    
    $filterPost = new Zend_Filter_Input($_POST);
    $alphaName = $filterPost->getAlpha('name');
    
    ?>
        

Striktes Blacklist Filtern:

    <?php
    
    $filterPost = new Zend_Filter_Input($_POST);
    $taglessComment = $filterPost->noTags('comment');
    
    ?>
        

Nicht striktes Whitelist Filtern:

    <?php
    
    $filterPost = new Zend_Filter_Input($_POST, FALSE);
    
    if ($email = $filterPost->testEmail('email')) {
        /* $email ist von einem gültigen E-Mail Format. */
    } else {
        /* $email ist von keinem gültigen E-Mail Format. */
    }
    
    ?>
        

Nicht striktes Blindes Filtern:

    <?php
    
    $filterPost = new Zend_Filter_Input($_POST, FALSE);
    $name = $filterPost->getAlpha('name');
    
    ?>
        

Nicht striktes Blacklist Filterrn:

    <?php
    
    $filterPost = new Zend_Filter_Input($_POST, FALSE);
    $comment = $filterPost->noTags('comment');
    
    ?>