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.
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 */ } ?>
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'; */ ?>
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!'; */ ?>
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.
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'); ?>