PHP Einsteigerkurs - Grundlagen der PHP/MySQL Programmierung in 5 Tagen verstehen
entsprechen. D.h. wenn eine Zahl
eingegeben werden soll, prüfen Sie am Besten immer mit der Funktion
is_numeric($zahl), ob es sich wirklich um eine Zahl handelt bzw. ob eine
Emailadresse so aufgebaut ist, wie es sein soll (es muss genau ein @Zeichen vorkommen
und am Ende muss eine Domain angegeben sein). Dies bringt uns auch gleich zum
nächsten Thema:
Schutz vor SQL Injection
Unter eine SQL Injection versteht man, dass es ein Besucher schafft, Daten
in ein SQL Query einzuschleusen. Dies geschieht, wenn man die eingegebenen
Daten nicht filtert.
Angenommen, wir haben folgendes Script, um für eine Webseite eine
Loginfunktionalität anzubieten:
$username =
$_GET["username"];
$password =
$_GET["password"];
$sql = "SELECT * FROM users
WHERE username = "".$username."" AND password =
"" . $password ."" ";
mysql_connect("localhost",
"root", "");
mysql_select_db("my_database");
$result = mysql_query($sql);
echo "Folgende User gefunden:
";
while ($row =
mysql_fetch_array($result)) {
echo
$row[username "]. "
";
}
mysql_close();
?>
Wenn die Besucher brav nur Ihren Usernamen oder ihr Password eingeben, ist
diese Funktionalität kein Problem. Aber leider gibt es technisch versierte
Cracker, die nach solch einfachen Loginscripten suchen - teilweise
automatisiert via Bots - und versuchen, Folgendes einzugeben:
Username: admin
Passwort: " OR 1=1
Wenn wir diesen Text ungefiltert in unsere SQL Abfrage übergeben, kommt
dabei Folgendes heraus:
SELECT * FROM users WHERE username = "admin" AND password =
"" OR 1=1
Da 1 immer gleich 1 ist, wird immer ein Ergebnis zurückgeliefert. Somit
könnte sich der Cracker eine Liste mit allen existierenden Usernamen erstellen
oder sogar eigene User hinzufügen:
Username: x
Passwort: x"; INSERT INTO users (username, password) VALUES
("mynewuser", "mypassword");
Der SQL wäre dann:
SELECT * FROM users WHERE username = "x" AND password =
"x"; INSERT INTO users (username, password) VALUES ("mynewuser",
"mypassword");
Beide Befehle würden ausgeführt werden und der Cracker hätte schon einen
neuen Useraccount angelegt. Theoretisch könnte er auch einen DELETE Befehl
abschicken und somit unsere Datenbank vernichten oder zum Beispiel das Passwort
des Administrators ändern.
Doch wie können Sie sich davor schützen?
Entweder filtern Sie auf bestimmte Zeichen (a-z, A-Z, 0-9) oder
"escapen" die eingegebenen Daten. Das bedeutet, dass alle
Sonderzeichen sowie die gesamte Zeichenkette von Apostrophen eingeschlossen
werden und somit "unschädlich" gemacht werden. Es gibt dafür die
vorgefertigte Funktion mysql_escape_string() , der man einfach die zu
"escapende" Zeichenkette übergeben muss und uns eine sichere
Zeichenkette zurückliefert.
Passwörter verschlüsselt speichern
Etwas, das selbst große Weltkonzerne leider bitter erfahren mussten, ist die
Notwendigkeit, Passwörter stets verschlüsselt in der Datenbank abzulegen. Es
gibt dabei Verschlüsselungsmethoden, die sogar nur in eine Richtung
verschlüsseln und aus beliebig langen Zeichenketten so genannte Hashs erzeugen.
Das sind Zeichenketten von einer vorher bekannten Länge. Eine weitverbreitete
Methode ist es, aus Passwörtern MD5 Hashs zu erzeugen, dies können Sie mit der
in PHP mitgelieferten Funktion md5() bewerkstelligen, die immer einen 32
stelligen Hash zurückliefert:
$meinPasswort =
"passwort123";
echo $meinPasswort;
echo "
";
echo md5($meinPasswort);
?>
Ausgabe:
passwort123
8c405ae1daf2575440a037284f934421
Der Hash lässt sich nicht mehr in Klartext zurück entschlüsseln. Das
bedeutet, dass Sie zum Beispiel bei einer Datenbank mit Logindaten die Hashes
als Passwörter speichern und vor dem Abgleich von Logindaten das eingegebene
Passwort ebenfalls mit der Funktion md5() verschlüsseln.
Passwörter versalzen
Ein weiterer Sicherheitsaspekt ist, sich vor Usern mit unsicheren
Passwörtern abzusichern. Statistiken aus großen Userdatenbanken zeigen, dass
immer ein beachtlicher Prozentsatz der Nutzer ein- und dieselben Passwörter
wie zum Beispiel asdf123, password, 1234567890 verwenden. Wenn ein Cracker
unsere Usertabelle mit den MD5 Hashes erbeutet, wäre es für ihn ein
Weitere Kostenlose Bücher