Startseite >> Eingabedaten überprüfen mit ext/filter

Eingabedaten überprüfen mit ext/filter

Rubrik: PHP, zu den Kommentaren

Die größte sicherheitsrelevante Schwachstelle in Blogs ist sicherlich die Kommentarfunktion. Die Kommentare sind normalerweise die einzige Funktion, in der Benutzer Daten an die Blog-Software schicken. Aus diesem Grund sollte hier besonders auf Sicherheit geachtet werden. Eine genaue Überprüfung der Benutzereingaben ist zwingend notwendig. Zu diesem Zweck bietet sich die neue PHP-Extension ext/filter an. Mit einer einfachen Validator-Klasse lässt sich ein Wrapper zum objektorientierten Zugriff implementieren.

PHP ext/filter

Seit PHP 5.2.0 existiert diese Extension zum filtern von Variablen, also auch Eingabedaten der Benutzer. ext/filter bietet spezielle Funktionen für URLs, E-Mail-Adressen oder auch einfache Datentypen. Ich selbst setze unter anderem ext/filter ein, um die Eingabedaten aus dem Kommentar-Formular zu überprüfen.

Die wichtigste Funktion von ext/filter ist die Funktion filter_var. Diese Funktion kann grundsätzlich für zwei Aufgaben verwendet werden. Zum einen zum validieren von Variablen, also checken, ob die übergebene Variable ein gefordertes Format erfüllt (z.B. E-Mail-Adresse) und zum anderen wird diese Fuktion zum säubern von Variablen verwendet. Zu diesem Zweck gibt es eine Menge von Filtern, die über vordefinierte Konstanten angegeben werden. Es folgen ein paar Beispiele, wie sie bei der Kommentarfunktion eines Blogs durchaus vorkommen könnten:

Validierung einer E-Mail-Adresse

Eine E-Mail-Adresse wird mit der Funktion filter_var folgendermaßen validiert:

<?php
$email 
'';
if(isset(
$_POST['email'] && $_POST['email'] != ''){
    
// E-Mail-Adresse validieren
    
if(filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
        
$email $_POST['email'];
    }else{
        
// E-Mail-Adresse war falsch => Fehler
    
}
}else{
    
// keine E-Mail-Adresse übergeben => Fehler?
}
?>

Hier wird gecheckt, ob in $_POST['email'] eine korrekte E-Mail-Adresse steht. Als ersten Parameter bekommt die Funktion die zu überprüfende Variable und als zweiten Parameter die Konstante FILTER_VALIDATE_EMAIL, die den E-Mail-Filter auswählt. filter_var gibt false zurück, falls der übergebene Wert den Test nicht besteht. Erst wenn die übergebene Variable den Test besteht, wird sie in die lokale Variable übenommen.

Validierung einer URL

Im Prinzip wird die Funktion filter_var genauso benutzt wie bei dem E-Mail-Check. Allerdings treten bei einer URL einige Besonderheiten auf. Zum einen gibt es ja außer den Adressen, die man so in den Browser eintippt noch einige andere Dinge, die eine korrekte URL sind. Zum anderen gibt es das Problem der korrekten Eingabe der URL. Auf das erste Problem will ich mal nicht weiter eingehen, wir beschränken uns hier auf normale Adressen von Webseiten. Was die Eingabe angeht, so ist die Frage ob mit http:// oder ohne. Ich selbst überlasse das dem Besucher und überprüfe lieber danach. Gegebenenfalls setze ich das http:// selbst davor. Eine Überprüfung einer URL könnte dann so aussehen:

<?php
$url 
'';
if(isset(
$_POST['url']) && $_POST['url'] != ''){
    
$url_with_scheme $_POST['url'];
    
// bei Bedarf mit Schema vervollständigen
    
if(!preg_match('/^http[s]?:\/\//'$url_with_scheme)){
        
$url_with_scheme 'http://' $url_with_scheme;
    }
    
// URL validieren
    
if(filter_var($url_with_schemeFILTER_VALIDATE_URL,
        
FILTER_FLAG_SCHEME_REQUIRED FILTER_FLAG_HOST_REQUIRED)){
        
$url $url_with_scheme;
    }else{
        
// fehlerhafte URL => Fehler
    
}
}else{
    
// keine URL übergeben => Fehler
}
?>

In diesem Beispiel wird filter_var mit drei Konstanten aufgerufen, FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED und FILTER_FLAG_HOST_REQUIRED und . Mit dem dritten Parameter können Optionen für den gewählten Filter angegeben werden. Hier also, dass das Schema (http://) und ein Host in der URL enthalten sein müssen.

Validator-Klasse für PHP mit ext/filter

Ich habe mir zur einfacheren Benutzung der Filterfunktionen, die ich so brauche, die Klasse Validator geschrieben. Diese Klasse enthält einige Funktionen zum überprüfen von Variablen auf bestimmte Typen und eine Funktion zur allgemeinen Säuberung von Text. Passend zur Klasse gibt es die Exception ValidateException. Hier ein Ausschnitt aus der Klasse Validator:

<?php
/**
 * Fehlerklasse für die Validator-Klasse
 *
 */

class ValidateException extends Exception{}
/**
 * Klasse zum checken und manipulieren von Benutzereingaben und anderen Daten
 * 
 * die is... Funktionen geben im Fehlerfall eine Exception zurück,
 * ansonsten den übergebenen Wert.
 * 
 */
class Validator{
    
/**
     * Checkt, ob der übergebenen Wert der Syntax einer E-Mail entspricht.
     *
     * @param string $value
     * @return string
     */
    
public function isEmail($value){
        if(
filter_var($valueFILTER_VALIDATE_EMAIL) === false){
            throw new 
ValidateException();
        }
        return 
$value;
    }
    
    
/**
     * Checkt, ob der übergebene Wert von der Syntax her einer URL entspricht.
     *
     * @param string $value
     * @return string
     */
    
public function isUrl($value){
        if(
filter_var($valueFILTER_VALIDATE_URL,
            
FILTER_FLAG_SCHEME_REQUIRED FILTER_FLAG_HOST_REQUIRED) === false){
            throw new 
ValidateException();
        }
        return 
$value;
    }
    
    
/**
     * Text entschärfen
     *
     * @param string $value
     * @return string
     */
    
public function saveText($value){
        return 
filter_var($valueFILTER_SANITIZE_SPECIAL_CHARS);
    }
}

?>

Die Klasse erleichtert die Benutzung von ext/filter etwas. So sind die verschachtelten if/else-Zweige aus den Beispielen oben dank der Exception nicht mehr notwendig. Die Benutzung würde dann folgendermaßen aussehen:

<?php
$validator 
= new Validator();
$url '';
if(isset(
$_POST['url']) && $_POST['url'] != ''){
    
// Bei Bedarf mit Schema vervollständigen    
    
$url_with_scheme $_POST['url'];
    if(!
preg_match('/^http[s]?:\/\//'$url_with_scheme)){
        
$url_with_scheme 'http://' $url_with_scheme;
    }
    
// auf gültige URL testen
    
try{
        
$url $validator->isUrl($url_with_scheme);
        
$url $url_with_scheme;
    }catch(
ValidateException $e){
        
// fehlerhafte URL => Fehler
    
}
}
?>

Zum eigentlichen validieren der URL wird einfach $validator->isUrl($url_with_scheme) aufgerufen. Wenn der URL-Test fehlschlägt, wirft die Klasse die Exception, die dann bei der Überprüfung behandelt werden kann.

Tipp 1: Variablen nicht säubern

Neben der Möglichkeit Variablen zu validieren, gibt es noch die Möglichkeit, Variablen zu säubern. Hierbei wird versucht, aus den übergebenen Daten beispielsweise eine E-Mail-Adresse zu bekommen (mit filter_var($_POST['email'], FILTER_SANITIZE_EMAIL)). Ich rate davon ab zu versuchen, Variablen, die einem bestimmten Format entsprechen müssen, selbst in dieses Format zu bringen. Die Variablen sollten immer nur mit den VALIDATE-Filtern auf Gültigkeit überprüft werden. Im Fehlerfall würde ich immer die Verarbeitung abbrechen, da sonst die Gefahr besteht, dass unsaubere Daten in die Anwendung, die Datenbank oder irgendwie in die Weiterverarbeitung kommen.

Weitere Informationen zu ext/filter gibt es natürlich auf http://www.php.net/

yigg

Einen Kommentar schreiben






Captcha

Buch-Box

PHP-Sicherheit
PHP/MySQL - Webanwendungen sicher programmieren

In Kapitel 9 wird ext/filter vorgestellt mit den Möglichkeiten, die diese Extension bietet.
Mehr Informationen bei:
Amazon.de

Beiträge nach Rubrik
Amazon.de: Bestseller RSS