O'Reilly logo

PHP-Sicherheit: PHP/MySQL-Webanwendungen sicher programmieren by Stefan Esser, Christopher Kunz

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

2019.6 Boolesche Werte
Auch wenn der Funktion filter_var() Oktal- oder Hexadezimalzah-
len übergeben werden, sind die Rückgabewerte stets im Dezimalsys-
tem – aus 0xff wird also 255.
Entwickler, die viel mit Float-Werten arbeiten und diese auch ausge-
ben müssen, wissen um die durch verschiedene Dezimalzeichen entste-
henden Probleme. Ähnlich der PHP-Funktion
number_format() können
Sie den Float-Filtern von ext/filter mittels einer Option mitteilen, ob ein
Punkt, ein Komma oder ein anderes Zeichen dafür genutzt werden soll:
$options = array("options" => array("decimal" => ","));
9.6 Boolesche Werte
Um Variablen in boolesche Wahrheitswerte umzuwandeln, können Sie
in PHP den Cast-Operator (boolean) verwenden. Allerdings wird die-
ser alle Werte ungleich 0 oder FALSE zu TRUE umwandeln, was in
Webanwendungen nicht immer sinnvoll ist. Der Filter FILTER_
VALIDATE_BOOLEAN prüft, ob die übergebene Variable einem
sprachlichen Konstrukt entspricht, das zu TRUE oder FALSE umge-
wandelt werden könnte. Er gibt TRUE zurück, falls das Argument ent-
weder TRUE, 1, »on« oder »yes« lautet. Falls ihm FALSE, 0, »off«
oder »no« übergeben werden, lautet der Rückgabewert FALSE. In
allen anderen Fällen gibt der Filter NULL zurück. Somit können Sie
auch Eingabedaten wie etwa HTML-Formularfelder vom Typ »Radio-
button« mit einem kurzen Filteraufruf validieren:
$radio = filter_var($_POST['radiobutton'],
FILTER_VALIDATE_BOOLEAN);
9.7 URLs validieren
Einen gültigen URL zu finden, ist eine trickreiche Angelegenheit:
Neben der fehlenden Längenbegrenzung gibt es sehr viele Sonderrege-
lungen und exotische Schreibweisen.
Würden Sie
http://12345:67890@3232238337:31337/?987654321=123 für
eine gültige Adresse halten? Nicht? Ist sie aber, denn dieser URL
beschreibt eine Verbindung zur IP-Adresse
3232238337 auf Port 31337,
wobei der Benutzername
12345 und das Passwort 67890 übergeben wer-
den. Im Query-String wird die Variable
987654321 transportiert und auf
123 gesetzt.
Derlei wenig bekannte Formatierungen für URLs kann sich ein
Angreifer zunutze machen, um ahnungslosen Opfern seriös wirkende
Adressen unterzuschieben, etwa bei Phishing-Angriffen. Einen Link auf
9 Variablenfilter mit ext/filter202
die Website http://www.paypal.com@3232238337 könnten unbedarfte Nut-
zer mit dem populären Bezahlsystem verwechseln, tatsächlich führt er
jedoch auf die IP-Adresse
192.168.11.1 und übergibt dort den Benutzer-
namen
www.paypal.com. Der Firefox-Browser warnt Nutzer, bevor er
eine derart präparierte Adresse öffnet, im Internet Explorer 7 wurde die
Unterstützung für Authentifizierungsdaten im URL ganz entfernt.
Die Filter-Extension für PHP kümmert sich nicht darum, ob ein
URL für den Betrachter verdächtig wirken könnte, sondern interessiert
sich lediglich für die syntaktische Korrektheit. Der Filter
FILTER_
VALIDATE_URL
ist dafür zuständig, URLs auf Korrektheit zu prüfen.
Standardmäßig sind diese beiden Filter jedoch sehr wenig restriktiv,
sodass auch ein String wie »foobar,blah« als gültiger URL durchgehen
könnte. Um sie für den vermutlichen Haupteinsatzzweck – nämlich die
Syntaxvalidierung von HTTP- oder FTP-URLs zu verwenden, sollten
Sie die Filter strenger konfigurieren. Sie können zu diesem Zweck mit
einigen zusätzlichen Flags aufgerufen werden:
FILTER_FLAG_SCHEME_REQUIRED – ist ein URL-Schema (http://, ftp://
etc.) notwendig?
FILTER_FLAG_HOST_REQUIRED – muss ein Host angegeben werden?
FILTER_FLAG_PATH_REQUIRED – muss der URL einen Pfad enthalten
(ein einfacher / am Ende des URL gilt als Pfad)?
FILTER_FLAG_QUERY_REQUIRED – wird ein Query-String erwartet?
Um einen HTTP-URL sinnvoll zu prüfen, sollten mindestens die bei-
den Flags
FILTER_FLAG_SCHEME_REQUIRED und FILTER_FLAG_HOST_REQUIRED
gesetzt sein. Damit sieht ein Aufruf für den validierenden Filter
FILTER_VALIDATE_URL in etwa aus wie folgt:
filter_var("http://12345:67890@1234567890:31337/?123=432",
FILTER_VALIDATE_URL, array("flags" => FILTER_FLAG_SCHEME_REQUIRED |
FILTER_FLAG_HOST_REQUIRED));
Da der übergebene Beispiel-URL syntaktisch gültig ist, wird er vom
validierenden Filter 1:1 zurückgegeben. Vorsicht ist jedoch bei URLs
mit Umlauten und UTF-8-Zeichen geboten. Obgleich moderne Brow-
ser diese korrekt als »Internationalized Domain Names« (IDN) inter-
pretieren, werden sie vom URL-Filter nicht anerkannt. Das liegt ein-
fach daran, dass Browser die auch als »Umlautdomains« beworbenen
IDN-Domains intern in das sogenannte Punycode-Format umwandeln
– aus http://www.fööbär.com/ wird so http://www.xn--fbr-rla2ga.com/
und dieser URL wird selbstverständlich auch von ext/filter anerkannt.
97+38=73>%76+?>/87K==/838 ?8C-9./?71/A+8./6>A/<./8

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required