dedlfix: Ist dieser code sicher (SQL Injection)?

Beitrag lesen

echo $begrüßung;

ich bin mir nicht sicher, ob der Code ausreichend sicher ist: Stichwort SQL Injection.

Wenn du so fragst, scheint mir, dass du das Prinzip nicht verstanden hast. Der Grundsatz lautet: Wann immer du Daten in einen anderen Kontext bringst, müssen sie kontextgerecht behandelt werden. In deinem Fall bringst du Daten in den Kontext eines SQL-Statements. Damit der Empfänger des Statements, der MySQL-Server, weiß, was Daten und was Befehlsbestandteil ist, braucht er eine Kennzeichnung der Daten. Vorgeschrieben ist, dass diese mit einfachen oder doppelten Anführungszeichen einzurahmen sind. Was passiert nun, wenn ein solches Zeichen in den Daten vorkommt? Es beendet die Zeichenfolge. Alles dahinter wird wieder als Befehlsbestandteil angesehen. Deshalb müssen die Anführungszeichen (und noch ein paar weitere) maskiert werden. Ihnen wird im Falle MySQLs ein Backslash vorangestellt, und damit verlieren sie ihre Bedeutung als Stringbegrenzer. Die Aufgabe der Maskierung übernimmt mysql_real_escape_string(). So wie du sie angewendet hast ist das schon mal richtig, aber es geht übersichtlicher.

$query = sprintf("SELECT * FROM tblbenutzer WHERE benutzer ='%s'", mysql_real_escape_string($uname));

Durch sprintf() und den Platzhalter %s spart man sich das String-Rein-Raus-und-Verknüpfen. Hier noch ein Beispiel für zwei Parameter:

$query = sprintf("SELECT * FROM tblbenutzer WHERE benutzer ='%s' AND password='%s'",
    mysql_real_escape_string($uname),
    mysql_real_escape_string($password));

Eine weitere Möglichkeit wären Prepared Statements. Die arbeiten im Prinzip wie das sprintf() mit Platzhaltern, übertragen aber das Statement und die Daten auf getrenntem Weg. Dabei spart man sich auch gleich noch das Maskieren, weil die Daten ja nicht mehr in den Text eines Statements eingebettet werden müssen. P.S. lassen sich aber nur mit der moderneren mysqli-Extension von PHP5 nutzen.

Außerdem fehlt bei dir komplett das Reagieren auf Fehlerzustände. Die mysql-Funktionen geben einen solchen über ihr Funktionsergebnis bekannt. Es ist dann False statt einer Ressourcenkennung. False ist aber kein gültiges Argument für die nachfolgenden mysql-Funktionen, was dann zu PHP-Fehlermeldung führt. Wenn du deine Anwendung robuster gestalten willst, bau eine Fehlerbehandlung ein. Ein "... or die(mysql_error);" ist zwar schnell eingefügt aber keine Fehlerbehandlung. Der Anwender, der diese Meldung zu sehen bekommt, kann damit nichts anfangen (und wenn er es kann, soll er es nicht). Besser ist, das Script auch im Fehlerfall geordnet zu beenden, den Administrator geeignet zu benachrichtigen und dem Anwender eine Alternative aufzuzeigen, wie er dennoch sein Ziel erreichen kann.

echo "$verabschiedung $name";