SQL-Injection sichere MySQL-Query Funktion

Immer wieder ein Thema: SQL-Injections in Webseiten. Nicht zuletzt, seit es immer mehr große Zeitschriften sich zum Thema machen, das Prinzip ‚Wie führe ich eine SQL-Injection durch‘ auch für die ganz … naja, sagen wir mal lernfaulen … auf zu schreiben, wird das Thema doch immer beliebter.

Deshalb stelle ich nun mal – im kleinen Rahmen natürlich – meine Funktion vor, mit deren Hilfe es mir gelang, meine Projekte bis dato SQL-Injection safe laufen zu lassen.

Die Funktion, wie ich sie hier vorstelle, ist nur ein Auszug aus der echten Funktion. Die Funktion selbst liegt bei mir auch innerhalb einer Klasse. Abgerundet mit vielen Features – wie z.B. logging der SQL-Strings, logging der Dauer einzelner und aller Abfragen usw., hat mir diese Klasse über die Jahre sehr gute Dienste geleistet, was eine schnelle, saubere und vor allem sichere Erstellung von Webprojekten angeht.

Okay, genug geschwafelt, hier der Code:

public function myquery()
{
   $args    = func_get_args();
   $query   = array_shift($args);
   $args    = array_map(‚mysql_real_escape_string‘, $args);
   // echo vsprintf($query, $args).“
\n“;
   return mysql_query(vsprintf($query, $args));
}
 

Der Experte sieht gleich, was hier passiert, allen anderen erkläre ich es gern. Die Funktion nimmt sich alle Argumente, benutzt das erste Argument als SQL-Query-String und alle folgenden als Argumente zu diesem String. Alle Argumente werden mit der Funktion mysql_real_escape_string behandelt, welche alle für mySQL gefährlichen Zeichen entsprechend ungefährlich macht (mal salopp ausgedrückt).

Dannach werden die Argumente mittels printf-Funktion in den Query gebracht und dann wird das ganze ausgeführt. Zurück bekommt ihr den Rückgabewert von mysql_query, mit dem ihr dann ganz normal weiterarbeiten könnt.

Ein Beispiel-Aufruf:

$sql = „SELECT userid FROM tblUser WHERE username=’%s‘ AND password=MD5(‚%s‘)“;
$_ressource = mysql_query_safe($sql,$_POST[„username“],$_POST[„password“]);

Hier wird – in einer sonst sehr gefährlichen Umgebung – die UserID nach einem Login anhand von Username und Passwort ermittelt, die der User eingegeben hat.

Die einzelnen Tags, also wann kommt ein %s, wann ein %u usw., das lest ihr am besten direkt bei der Funktion sprintf nach.

Verbesserungsvorschläge nehme ich natürlich gern entgegen.

2 Gedanken zu „SQL-Injection sichere MySQL-Query Funktion

  1. Said85er

    eine nette Idee, jedoch das Anlegen einer ArrayMap und die verwendeten Operationen bei einer Abfragemenge von n-Abfragen ist etwas uneffizent

    da solltest du lieber mal dir PDO anschaun 😉

    Antworten
    1. Sascha Presnac Beitragsautor

      @Said85er: Mache ich heute auch so, aber damals ging das noch nicht oder nur sehr umständlich. Die meisten Hoster erlaubten dir nur das „normale“ mysql_xyz zu benutzen, da brauchte es so eine Funktion, um einigermaßen über die Runden zu kommen.
      Aktuell ist das nicht mehr, da gebe ich dir Recht 😉

      Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.