PHP-Filter für den Eigengebrauch

Teil 3: Sicherheit bei PHP: Bereinigen von Daten durch eine Web-Applikation

Damit sind nur Werte aus dem Bereich zwischen 0 und 256 erlaubt. Die Überprüfung der Variable $var erfolgt mittels:

if(!filter_var($var, FILTER_VALIDATE_
INT, $int_options)) {
echo("Wert unzulässig."); }
else { echo("Wert erlaubt."); }

Validieren von E-Mail-Adressen

Das Validieren und Bereinigen von E-Mail-Adressen gehört zum Pflichtenheft so gut wie jeder Web-Applikation und doch wird diese Aufgabe oft unzureichend erfüllt.

Zum Filtern von E-Mail-Adressen gibt es mehrere Ansätze. Generischer Code zum Validieren einer E-Mail-Adresse macht sich einen regulären Ausdruck zunutze und nimmt etwa die folgende Form ein:

$filter = "^[A-Za-z0-9](([_\.\-]?[a-
zA-Z0-9]+)+)@(([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)){2,}\.([A-Za-z]){2,4}+$";
if (!preg_match($filter, $email_adres
se)) { echo "Adresse unzulässig."; }
else { echo "Adresse okay";}

Tipp: Mit PHP 6 werden ereg-Funktionen in eine externe Erweiterung ausgelagert und nicht mehr Teil des PHP-Core sein. Wer also heute eigene Filter schreibt, sollte statt ereg konsequent nur noch preg einsetzen. Preg-Funktionen sind nicht nur schneller sondern auch vielseitiger und flexibler, sie setzen allerdings derzeit das aktivierte PCRE-Modul voraus. Um zu ermitteln, ob Ihre Installation kompatibel ist, können Sie einfach die Funktion phpinfo() aufrufen.

Es spricht ja prinzipiell auch nichts dagegen, E-Mail-Adressen mit einem regulären Ausdruck zu filtern, außer eben der kaum durchschaubaren Komplexität zulässiger Zeichenkombinationen, die sich nur schwer in reguläre Ausdrücke gießen lassen.

Wer wirklich einen RFC-konformen E-Mail-Filter implementieren wollte, müsste weitaus tiefer in die Trickkiste greifen. Ein solcher Filter kann mithilfe von FILTER_CALLBACK eingebunden werden.

RFC-konformer E-Mail-Filter

Eine E-Mail-Adresse besteht aus einem bis zu 64 Zeichen langen lokalen Teil, gefolgt von dem @-Symbol und einem bis zu 255 Zeichen langen Domain-Namen. Der lokale Teil einer Adresse kann außer Buchstaben und Ziffern folgende Zeichen verwenden:

$-_.+!*'(),{}|\\^~[]`<>#%";/?:&=.

Der eingebaute E-Mail-Filter ist nicht RFC-konform, dafür aber extrem einfach. Unter Verwendung von filter_var() genügt etwa dieser Code:

if (!filter_var($email_adresse, FIL
TER_VALIDATE_EMAIL)) {
echo "E-Mail-Adresse unzulässig."; }

RFC-Richtlinien der IETF erlauben in einer E-Mail-Adresse explizit unter bestimmten Bedingungen eher ungewöhnliche Zeichenkombinationen. Diese werden in der Praxis zwar kaum genutzt, können aber ab und zu dennoch vorkommen.

Darüber hinaus haben andere Zeichen, darunter ()<>[]:;@\, laut IETF ebenfalls ihren berechtigten Platz in einer E-Mail-Adresse, sofern sie in Anführungszeichen eingeschlossen sind. Runde Klammern, die nicht in Anführungszeichen stehen, sind als Kommentarzeichen zu verstehen; Zeichen, die in runden Klammern eingeschlossen sind, sind demnach nicht Teil der E-Mail-Adresse. Kommentare in einer E-Mail-Adresse stellen nicht einen integralen Teil der Adresse dar.

Zum Beispiel entspricht Boris(Vorname).Stefan(Nachname)@email(server).de(TLD) der E-Mail-Adresse Boris.Stefan@email.de. Ein RFC-konformer E-Mail-Filter sollte zwischen Kommentaren und der eigentlichen E-Mail-Adresse unterscheiden können. Der eingebaute PHP-Filter geht generell restriktiver vor und lehnt ungewöhnliche Zeichen einfach komplett ab.

In der Praxis wird diese Flexibilität der RFC-Richtlinien kaum in Anspruch genommen, da die meisten Web-Applikationen Filter verwenden, die eine RFC-konform geformte E-Mail-Adresse ablehnen. Damit klafft die Schere zwischen Theorie und Praxis recht weit auseinander.

Es stellt sich daher die Frage, ob man sich nicht lieber doch auf den eingebauten PHP-Filter zum Validieren von E-Mail-Adressen verlassen sollte. Dieser geht zwar restriktiver vor und lehnt zahlreiche formal zulässige E-Mail-Adressen ab, aber setzt bei der Validierung auf den gesunden Menschenverstand statt auf unüberschaubar kryptische RFC-Richtlinien.

Bereinigen und Kodieren der Eingabe

Nicht bei jeder Art von Daten lässt sich ein bestimmtes Eingabeformat erzwingen. Ein gutes Beispiel sind Textfelder zum Einsenden von Forumsbeiträgen oder das Kommentarfeld in einem Bestellformular. Diese Art von Daten muss bei der Eingabe bereinigt und ggf. kodiert werden.

Zum Bereinigen von Daten dient in PHP (ab der Version 5.2 im PHP-Core) der Filter FILTER_SANITIZE_STRING. Dieser Filter kann problematische Zeichen entfernen und die Eingabe codieren. Zum Entfernen von Tags verwendet man diesen Code:

$string = "<script>Das könnte gefähr
lich sein!</script>";
echo filter_var($string, FILTER_SANI
TIZE_STRING);

Durch das Entfernen der <script>-Tags stellen Sie sicher, dass die betreffende Zeichenkette nicht mehr ausgeführt werden kann. Mit optionalen Parametern können Sie sich über den ganzen Vorgang zusätzliche Kontrolle verschaffen. Zum Beispiel mittels:

$string = "<script>\"'Das könnte ge
fährlich sein!'\"</script>";
echo filter_var($string, FILTER_SA
NITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES);

Mehr zum Thema

Youtube Sperre umgehen GEMA
Videos freischalten

So umgehen Sie die GEMA-Sperre bei Youtube. Was Sie dazu brauchen, und wie es am einfachsten geht.
Neue Fritzboxen unterstützen den AC-Standard.
WLAN-Geschwindigkeit verdoppeln

Mehr WLAN-Geschwindigkeit: Mit dem WLAN-Standard 802.11ac und den richtigen Geräten und Einstellungen verdoppeln Sie den Datendurchsatz.
Netflix auf dem TV
Programm in der Übersicht

Welche Filme und Serien gibt es bei Netflix eigentlich zu sehen? Was ist neu im Streaming-Angebot? Diese Antworten helfen weiter.
Netflix
Streaming

Preise, kompatible Geräte, Datenrate, Serien- und Filmangebot von Netflix: Wir beantworten die wichtigsten Fragen rund um den Streaming-Dienst.
E.T. – Der Außerirdische
Vorschau auf Film- und Serien-Highlights

Amazon Prime Instant Video lockt im Dezember 2016 mit Film-Highlights wie "E.T.", "Fast & Furious 7" und der Serie "Ku’damm 56​".