PHP-Filter für den Eigengebrauch

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

Fazit

Jede Web-Applikation sollte der Eingabe von externen Daten jeglicher Art grundsätzlich erst einmal misstrauen. Eingaben sollten immer validiert beziehungsweise bereinigt und die Ausgabe einer Web-Applikation ausmaskiert werden. Ob man das Ziel mithilfe der eingebauten PHP-Filter oder mit eigenen Funktionen erzielt, ist dabei eigentlich zweitrangig.

Sicherheit bei PHP

© Archiv

Eine XSS-Attacke auf ein Skript mit nicht bereinigter Variable $_SERVER['PHP_SELF'].

Zu den unverkennbaren Stärken der eingebauten PHP-Filter zählt ihre bemerkenswerte Simplizität im Vergleich zu selbst gemachten Alternativen, die sich in hochwertiger Qualität als extrem arbeitsintensiv erweisen können.

Diese Einfachheit der eingebauten PHP-Filter wird jedoch vergleichsweise teuer erkauft: Wer sich in der Überzeugung wiegt, dass gefilterte Eingaben hinreichend sicher seien, sieht sich des Öfteren getäuscht.

Webserver-Software auf dem neuesten Stand zu bringen, verschlüsselte Verbindungen zum Transport sensitiver Daten einzusetzen und PHP-Filter zu verwenden sind zwar lobenswerte und erforderliche Maßnahmen, aber sie bieten noch keine Garantie für die Sicherheit der betreffenden Web-Applikationen.

Die eingebauten PHP-Filter repräsentieren, zumindest gegenüber gar keinen Filtern, einen großen Fortschritt, den bisher viele Web-Programmierer noch gar nicht entdeckt haben. Für diejenigen, die ihre Filterfunktionen ohnehin lieber selbst schreiben, um auf alle Aspekte der Datenverarbeitung Einfluss nehmen zu können, ändert sich an der bisherigen Arbeitsweise nichts.

Shared-Hosting scheidet bei eCommerce-Transaktionen prinzipiell aus, da man seine Sitzungsdaten mit anderen Webserver- Applikationen sharen, also gemeinsam nutzen muss. Die deutlich höheren Kosten eines dedizierten Servers sind ein unvermeidlicher Preis für eine professionelle eCommerce-Umgebung. Man sollte darauf achten, PHP-Sessions applikationsspezifisch aufzubauen und Sitzungsdaten geschützt aufzubewahren.

Das Filtern der Daten-Eingabe und das Maskieren der Ausgabe reichen aber noch lange nicht, um Session-Cookie-Manipulationen in Session-Race-Conditions () durch beinahe zeitgleich ablaufende Transaktionen zu vermeiden. Applikationsspezifische Sessions auf einem Dedicated Server sind hier der einzige Weg.

Bei vielen Web-Applikationen kommen spezielle Anforderungen hinzu, die die generischen PHP-Filter nicht erfüllen können. In diesen Fällen sind nach wie vor eigene Funktionen zum Überprüfen und Bereinigen der Eingabe erforderlich und auch dringend zu empfehlen.

PHP_SELF und Cross-Site-Scripting

Das superglobale Array $_SERVER beinhaltet verschiedene Informationen über die Ausführungsumgebung und den Server. Sie umfasst unter anderem das Element $_SERVER['PHP_SELF']. Diese global verfügbare, vordefinierte Variable liefert den Dateinamen des jeweiligen Skriptes, welches gerade ausgeführt wird, wie zum Beispiel

echo $_SERVER['PHP_SELF'];

Leider ist diese Variable durch Cross-Site-Scripting-Attacken (XSS) verwundbar. Wird in das Dokument oder in die URL beim Aufruf der Datei ein Javascript-Schnipsel eingefügt, wird dieser ausgeführt. Zum Beispiel mittels

echo $_SERVER['PHP_SELF'].'/<script>alert("So funktioniert XSS");</script>';

wird eine Javascript-Meldung angezeigt. Bereits eine harmlos aussehende Zeile Code wie diese:

echo $_SERVER['PHP_SELF'];

kann für XSS-Attacken missbraucht werden. Hat die betreffende PHP-Datei den Namen Beispiel.php, kommt eine XSS-Attacke bereits durch den Aufruf der folgenden URL zustande:

http://domain-name.de/Beispiel.php/%3Cscript%3Ealert(%22ANGRIFF%20ERFOLGREICH%22);%3C /script%3E

Die einfachste Gegenmaßnahme beim Einsatz von PHP_SELF besteht darin, die Variable immer zu bereinigen. Unter Verwendung der eingebauten Filterfunktionen genügt bereits eine einzige Zeile Code, um einen Angriff zu unterbinden:

echo filter_var($_SERVER['PHP_SELF'], FILTER_SANITIZE_STRING);

Dadurch wird die besprochene XSS-Attacke wirksam und zuverlässig verhindert.

Viele XSS-Szenarien werden durch die Übernahme ungefilterter Eingabe möglich. Gibt man als Wert des action-Attributes eines <form>-Tags die Variable $_SERVER['PHP_SELF'] aus, ohne sie durch das Encodieren von HTML-Tags zu bereinigen, kann ein Angreifer XSS-Attacken feuern, indem er auf einer Webseite, die er kontrolliert, einen Link wie diesen anbringt:

<a href="http://www.domain.com/login.php/"><script type="text/javascript">/* SKRIPT */</script><span a="'>ABC-Bank.de</a>

Der Javascript-Code würde einen Event-Handler definieren und an das Submit-Ereignis des Formulars binden. Dieser Event-Handler würde dann mittels eines <img>-Tags eine externe Datei laden, samt des eingegebenen Benutzernamens und Passwortes.

Abhilfe schafft die Benutzung von $_SERVER['SCRIPT_NAME'] statt des sonst üblichen $_SERVER['PHP_SELF']. Außerdem sollte man jede Textzeichenkette enkodieren, die nicht als HTML interpretiert werden sollte, außer man ist sich ganz sicher, dass sie nur harmlose und ungefährliche Zeichen enthalten kann.

Übersicht der Filterfunktionen

PHP-Filter im Überblick    
ID des PHP-Filters Beschreibung Flags
FILTER_VALIDATE_INT validiert die Eingabe als Integer; optional kann eine Bereichsprüfung der Werte stattfinden. FILTER_FLAG_ALLOW_OCTAL
FILTER_FLAG_ALLOW_HEX
FILTER_VALIDATE_BOOLEAN liefert als Rückgabewert TRUE für "1", "true", "on" und "yes"; liefert den Rückgabewert FALSE für "0", "false", "off", "no", und "", NULL. Unter Verwendung des Parameters FILTER_NULL_ON_FAILURE liefert der Filter den Rückgabewert FALSE nur für die folgende Eingabe: "0", "false", "off", "no", und "". Für alle Werte nicht vom Typ Boolean liefert der Filter NULL zurück. FILTER_NULL_ON_FAILURE
FILTER_VALIDATE_FLOAT validiert die Eingabe als float FILTER_FLAG_ALLOW_THOUSAND
FILTER_VALIDATE_REGEXP validiert den Wert gegen regexp, einen Perl-kompatiblen regulären Ausdruck  
FILTER_VALIDATE_URL validiert die Eingabe als eine URL; optional kann die Zeichenkette auf benötigte URL-Komponenten eingeschränkt werden FILTER_FLAG_PATH_REQUIRED
FILTER_FLAG_QUERY_REQUIRED
FILTER_FLAG_SCHEME_REQUIRED
FILTER_FLAG_HOST_REQUIRED
FILTER_VALIDATE_EMAIL validiert Werte als eine E-Mail-Adresse  
FILTER_VALIDATE_IP validiert Werte als eine IP-Adresse; optional kann die Prüfung auf IPv4 oder IPv6 eingeschränkt werden und private sowie reservierte IP-Bereiche ausschließen FILTER_FLAG_IPV4
FILTER_FLAG_IPV6
FILTER_FLAG_NO_PRIV_RANGE
FILTER_FLAG_NO_RES_RANGE
Filter zum Bereinigen und Kodieren der Eingabe    
FILTER_SANITIZE_STRING bereinigt eine Zeichenkette um Tags; optional bereinigt oder kodiert bestimmte Sonderzeichen (der Alias-Filter FILTER_SANITIZE_STRIPPED sollte nicht verwendet werden) FILTER_FLAG_NO_ENCODE_QUOTES
FILTER_FLAG_STRIP_LOW
FILTER_FLAG_STRIP_HIGH
FILTER_FLAG_ENCODE_LOW
FILTER_FLAG_ENCODE_HIGH
FILTER_FLAG_ENCODE_AMP
FILTER_SANITIZE_ENCODED URL-kodiert eine Zeichenkette; optional können Sonderzeichen entfernt oder kodiert werden FILTER_FLAG_STRIP_LOW
FILTER_FLAG_STRIP_HIGH
FILTER_FLAG_ENCODE_LOW
FILTER_FLAG_ENCODE_HIGH
FILTER_SANITIZE_SPECIAL_CHARS HTML-kodiert '"<>&-Zeichen, Zeichen mit einem ASCII-Wert kleiner als 32 und HTML-Escape; optional können andere Sonderzeichen entfernt oder korrigiert werden FILTER_FLAG_STRIP_LOW
FILTER_FLAG_STRIP_HIGH
FILTER_FLAG_ENCODE_HIGH
FILTER_SANITIZE_EMAIL entfernt alle Zeichen mit Ausnahme von Buchstaben, Zahlen und !#$%&'*+-/=?^_`{|}~@.[]  
FILTER_SANITIZE_URL entfernt alle Zeichen mit der Ausnahme von Buchstaben, Zahlen und $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&=  
FILTER_SANITIZE_NUMBER_INT entfernt alle Zeichen außer Zahlen, Plus- und Minus-Zeichen  
FILTER_SANITIZE_NUMBER_FLOAT entfernt alle Zeichen außer Zahlen, Plus- und Minus-Zeichen und optional . , FILTER_FLAG_ALLOW_FRACTION
FILTER_FLAG_ALLOW_THOUSAND
FILTER_FLAG_ALLOW_SCIENTIFIC
FILTER_SANITIZE_MAGIC_QUOTES wendet auf die Eingabe die Funktion addslashes() an  
Sonstige Filter    
FILTER_UNSAFE_RAW liefert den Eingabewert unverändert zurück, optional bereinigt oder kodiert Sonderzeichen FILTER_FLAG_STRIP_LOW
FILTER_FLAG_STRIP_HIGH
FILTER_FLAG_ENCODE_LOW
FILTER_FLAG_ENCODE_HIGH
FILTER_FLAG_ENCODE_AMP
FILTER_CALLBACK ruft eine benutzerdefinierte Filter-Funktion auf  

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​".