Üblicherweise weiß eine Serveranwendung ja, welche Felder sie in welchem Format erwartet. Dass die Daten auch passend vorliegen, muss vor der Verarbeitung über Validierung und Filterung sichergestellt werden.
Nehmen wir mal als Beispiel ein Feld
$_GET['entriesPerPage'], wie es etwa bei einer Datenbanksuche eingesetzt werden könnte.
Der Inhalt dieses Felds ergibt für eine Verabeitung nur Sinn,
- wenn er überhaupt gesetzt ist,
- wenn er als Ganzzahl (Integer) interpretiert werden kann
- und wenn diese Zahl in einem bestimmten Bereich (z. B. zwischen 5 und 50) liegt.
Eine der einfachsten Möglichkeiten, das sicherzustellen, wäre wohl diese:
PHP:
$_GET['entriesPerPage'] = (isset($_GET['entriesPerPage']))
? (int) $_GET['entriesPerPage']
: 20;
if ($_GET['entriesPerPage'] < 5) {
$_GET['entriesPerPage'] = 5;
} else if ($_GET['entriesPerPage'] > 50) {
$_GET['entriesPerPage'] = 50;
}
Wenn das Feld gesetzt ist, wird es auf
(int) gecastet, wenn nicht, wird es auf den Defaultwert von
(int) 20 gesetzt. Dann wird überprüft, ob der Inhalt zwischen 5 und 50 liegt. Nach diesem Abschnitt ist sichergestellt, dass
$_GET['entriesPerPage'] existiert und eine Ganzzahl zwischen 5 und 50 enthält.
(Diese Art der Verarbeitung ist allerdings sehr verzeihend, da *jede* Eingabe -- egal wie falsch -- zu einer korrekten Ausgabe führt und der Benutzer niemals eine Fehlermeldung zu sehen bekommt.)
Meiner Ansicht nach ist es sinnvoll, jedes Feld explizit zu typecasten, das nicht als String verarbeitet werden soll[1], da so sichergestellt ist, dass keine Eingaben durch die lose Typisierung gemogelt werden können.
PHP:
<?php
$_GET['entriesPerPage'] = '25 hallo welt';
if ($_GET['entriesPerPage'] < 5) {
$_GET['entriesPerPage'] = 5;
} else if ($_GET['entriesPerPage'] > 50) {
$_GET['entriesPerPage'] = 50;
}
echo 'Einträge pro Seite: ' . $_GET['entriesPerPage'];
1: Auch bei Strings müsste im Grunde getypecastet oder auf
is_array() geprüft werden, da PHP manche Eingaben automatisch zu Arrays umformt.
PHP:
<?php
$_GET['username'] = array();
$_GET['username'] = (isset($_GET['username']))
? trim($_GET['username'])
: '';
(string) array() ergibt übrigens den String "Array".
Dasselbe Problem tritt auch bei Prüfungen mit etwa preg_match() ohne vorheriges Typecasting auf:
PHP:
<?php
$_GET['entriesPerPage'] = array();
if (!preg_match('/^[1-9]\d*$/', $_GET['entriesPerPage'])) {
die('Keine Ganzzahl');
}
Wegen dieser Feinheiten gibt es fertige Klassen zur Filterung/Validierung.