8.2. Zend_Filter_Input
Zurück | Kapitel 8. Zend_Filter | Weiter

## 8.2. Zend_Filter_Input

### 8.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.

### 8.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 */
        }

        ?>

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

        ?>

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

        ?>

### 8.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 8.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 8, Zend_Filter.

### 8.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');

        ?>

Zurück | Nach oben | Weiter
Kapitel 8. Zend_Filter | Zum Anfang | Kapitel 9. Zend_Http