SQL Injection vermeiden

Hallo,

ich beschäftige mich gerade mit dem Thema SQL Injections, weil ich ein Formular in PHP programmiert habe, das die eingetragenen Daten in eine MySQL-Datenbank einträgt.

Nun surfe ich von einer Seite zur nächsten und werde nicht recht schlau bzw. finde nicht genau das, was ich suche…

In dem Formular werden Name, Vorname, Strasse, Postleitzahl, Ort, Telefonnummer usw abgefragt.

Wie kann ich nun SQL-Injections über diese input-Felder verhindern?

Im Prinzip sieht der Code zB gerade so aus:

Weiterverabeitung dann:

$vname = $HTTP\_POST\_VARS['vname'];

Und dann die SQL-Eintragung in DB:

$sql = "INSERT INTO formular (.., .., vname, .., ..)";

Wie kann ich denn jetzt verhindern, dass über dieses einfach Input-Feld SQL-Befehle abgesetzt werden können?
Bin auch sehr dankbar für weiterführende Links, die sich dem Thema detailliert widmen und nicht nur allgemeine Lösungen aufzeigen, nach was man alles schauen muss, sondern wie man das im Einzelfall auch programmiertechnisch tut.

Grüsse
schuelsche

du solltest überprüfen, ob es sich um gültige Daten handelt. Z.B.: Postleitzahl besteht nur aus Ziffern oder eine E-Mailadresse muss ein bestimmtes Format haben. Auch kenn ich keinen der ein ‚>‘ in seinem Namen hat :wink:. Um das zu Überprüfen, sind regex sehr hilfreich.
Auch gibt es in php Funktionen die gefährliche Zeichen escapen(wie http://at2.php.net/manual/en/function.mysql-real-esc…).
Btw.: kannst du auch Javascript Code in eine Webseite einschleusen(siehe http://de.wikipedia.org/wiki/XSS).
==>Regel: „all input is evil until proven otherwise“
Also immer alle Daten auf Gültigkeit überprüfen.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

$vname = $HTTP_POST_VARS[‚vname‘];

Seit PHP4 heißt das $_POST[‚vname‘] :smile:

Wie kann ich denn jetzt verhindern, dass über dieses einfach
Input-Feld SQL-Befehle abgesetzt werden können?

Ich habe mich bisher noch nicht mit diesem Thema beschäftigt, aber das sollte ich wohl. Bei einem Blick auf http://de.wikipedia.org/wiki/SQL-Injection hab ich folgendes gefunden:

SQL-Injection-Bugs treten auf, wenn eine Applikation SQL-Abfragen an den Server weiterreicht, ohne die vom Benutzer eingegebenen Parameter gesondert zu prüfen und etwaig enthaltene Funktionszeichen zu maskieren, um ihnen so die Sonderfunktion zu nehmen. Funktionszeichen in SQL sind zum Beispiel der umgekehrte Schrägstrich, der Apostroph oder das Semikolon. Diese Zeichen können durch Voranstellen des Maskierungszeichens, einem umgekehrten Schrägstrich, als Text gekennzeichnet werden. Dieser Vorgang wird auch „Escapen“ genannt.

Das geht in PHP mit addslashes(). Dabei wird das Semikolon nicht beachtet, aber ich glaube, dass mach bei PHP keinen Unterschied. Alternativ kannst du ja auch

strtr($query, array('\'=\>'\\', '"'=\>'\"', "'"=\>"\\'", ';'=\>'\;'))

schreiben.

Johannes Matschke

http://shiflett.org/archive/184
^^ sollte genau das sein was du suchst…