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

673.4 Variablen richtig prüfen
Um dieses Problem zu verhindern, ist es unerlässlich, die Mail-
adresse des Formularabsenders grob auf syntaktische Korrektheit zu
prüfen. Idealerweise erledigen Sie das mit einem regulären Ausdruck:
preg_match("#^[$x]+(\.?([$x]+\.)*[$x]+)?(([a-z0-9]+-*)?[a-z0-
9]+\.)+[a-z]{2,6}.?#", $_POST['absender'])
Beachten Sie bitte, dass das Format für E-Mail-Adressen sehr komplex
ist und sehr viele Formatierungsmöglichkeiten zulässt. Dieser reguläre
Ausdruck ist daher nur eine sehr grobe Näherung.
Alternativ zu einer Überprüfung auf syntaktisch korrekte Mail-
adressen können Sie auch prüfen, ob die Mailadresse Newlines enthält
– tut sie das, können Sie davon ausgehen, dass gerade ein Angriff per
Header-Injection versucht wird.
$absender = urldecode($_POST["absender"];);
if (eregi("\r",$absender) || eregi("\n",$absender)){
die("Header-Injection vermutet, breche ab");
}
Wie üblich für PHP führen immer mehrere Wege zum Ziel: Sie können,
falls Sie die Suhosin-Extension für PHP installiert haben, mit der
Direktive
suhosin.mail.protect das Einfügen von doppelten Zeilenum-
brüchen, auf dem dieser Angriff basiert, vollständig unterbinden.
Zusätzlich können Sie die Sicherheitsextension anweisen, Header vom
Typ CC, BCC, To und Subject im vierten Parameter zu
mail() zu ver-
bieten. Dieser Schutz ist deutlich wirksamer als die beiden in PHP imp-
lementierten Möglichkeiten in diesem Abschnitt; wenn Sie die Mög-
lichkeit haben, sollten Sie stets Suhosin nutzen. Im Abschnitt 11.1
erfahren Sie mehr über diese Funktion.
3.4 Variablen richtig prüfen
Nachdem Sie die Vorbereitungen für die Parametermanipulation ken-
nengelernt, die dafür notwendigen Werkzeuge installiert haben und
wissen, welche Bereiche Ihrer Applikation sicherheitskritische Bereiche
haben können, zeigen wir Ihnen auf den folgenden Seiten, wie Sie Vari-
ablen korrekt validieren. Die korrekte und sorgfältige Überprüfung
muss in jeder Applikation implementiert werden, um gegen Parameter-
manipulation geschützt zu sein. Die Prüfung einer Variablen sollte
nach folgenden Regeln ablaufen:
Prüfung auf den richtigen Datentyp
Prüfung auf die Länge
Prüfung auf den Inhalt und ggf. Maskieren von Sonderzeichen oder
HTML-Code
3 Parametermanipulation68
In den folgenden Abschnitten zeigen wir Ihnen anhand von Beispielen,
wie Sie diese Prüfungen in Ihrer Anwendung integrieren können.
3.4.1 Auf Datentyp prüfen
Da PHP eine schwach typisierte Sprache ist, kann eine Variable mit
dem Inhalt »1« ein String, ein Integer oder ein Typ Boolean sein. Bei
der Übergabe per Formular oder URL sind alle Variablen Strings.
Daher müssen sie vor der weiteren Verarbeitung in den richtigen
Datentyp umgewandelt werden.
Der Vergleichsoperator
===
In PHP 4 wurde der Vergleichsoperator === eingeführt, der nicht
nur den Inhalt, sondern auch den Typ vergleicht. Diesen sollten Sie in
Ihren Applikationen immer bei Variablenvergleichen verwenden, um
Typenmanipulationen zu vermeiden. Sie müssen sich aber auch vor
Augen führen, dass Variablen aus
$_GET, $_POST und $_COOKIE immer als
String in den globalen Namensraum übernommen werden.
settype() Um nun den gewollten Datentyp zu erhalten, stellt PHP für die
Typisierung die Funktion
settype() zur Verfügung. An diese Funktion
können die Variable und der gewünschte Typ übergeben werden.
Wenn es sich nun um einen Parameter handelt, der ein Integer sein soll,
der aber Text enthält, werden alle Buchstaben in diesem String
gelöscht. Aus Strings wie »1234abc« wird so »1234«.
<?php
$var1 = "1234abc"; // string
$var2 = true; // boolean
settype($var1, "integer"); // $var1 ist jetzt ein
// Integer (1234)
settype($var2, "string"); // $var2 ist jetzt ein
// String ("1")
?>
Der Cast-Operator
Einfacher ist die Typumwandlung mit dem Cast-Operator. Mit dem
Variablentyp in Klammern vor der zu typisierenden Variablen kann
diese Umwandlung einfach durchgeführt werden.
<?php
$var_int = (int) $_GET['id'];
?>
Folgende Typbezeichnungen gibt es für den Cast-Operator:
bool – für true oder false
int – für Integerwerte
float – für Fließkommazahlen, früher hieß dieser Typ »double«, ab
PHP 4.2.0 wurde dieser in »float« umbenannt
693.4 Variablen richtig prüfen
string – für Zeichenketten
array – für Arrays
object – für Klassen oder sonstige Objekte
null – für NULL-Werte
Um eine Manipulation von numerischen Variablen festzustellen, muss
man die Variable nach dem Casten mit dem ursprünglichen Wert ver-
gleichen.
<?php
if ((string)((int)$_GET['id']) !== $_GET['id'])
die ("Manipulation!");
?>
So können Sie feststellen, ob die Variablen manipuliert wurden, und
die entsprechenden Schritte einleiten (Programmabbruch oder Fehler-
meldungen). Da GET-Variablen immer als String vorliegen, muss hier
ein »Zurück«-Casten erfolgen, da
$_GET['id'] vom PHP-Interpreter
intern ebenfalls in einen
int umgewandelt wird und somit dieser Ver-
gleich immer
true ergibt. Um auszuschließen, dass nicht weitere Mani-
pulationen von
$_GET stattgefunden haben, wird hier der Operator ===
zum Vergleich von Inhalt und Typ verwendet.
PHP bietet Ihnen viele Möglichkeiten, die Typen Ihrer Variablen
zu überprüfen. Neben einer Prüfung auf den Inhalt sollte immer eine
Überprüfung auf den richtigen Typ erfolgen – verwenden Sie hierzu
den
===-Operator.
3.4.2 Datenlänge prüfen
Daten, die aus HTML-Formularen an eine PHP-Applikation überge-
ben werden, können im HTML-Code mit einem
maxlength-Attribut
versehen werden. Dies schützt aber nicht vor böswilligen Manipulatio-
nen – die Längenbeschränkung kann auf triviale Weise umgangen wer-
den. Überprüfen Sie die HTML-Formularfelder in Ihrem PHP-Code
auf die Längenangaben, die Sie in einem Attribut
maxlength möglicher-
weise angegeben haben.
strlen()
zur
Längenprüfung
PHP stellt uns für die Überprüfung der Variablenlänge die Funk-
tion
strlen() zur Verfügung.
<?php
if (strlen($passwort) < 8 || strlen($passwort) > 20)
die "Passwort ist falsch";
?>
Firmen, die eine bestimmte Security-Policy verfolgen, schreiben vor,
wie lange und aus welchen Zeichen ein Passwort bestehen muss. In

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