Vinzenz Mai: Kontextwechsel - Sichere queries in SQLite3

Beitrag lesen

Hallo,

Hier habe ich dann von der nativen Funktion escapeString gelesen. Die ist jetzt so nett und macht aus ' ein ". Und was, wenn der User jetzt Lil' John heisst?

Allerdings: was soll daran jetzt sicher sein?

Das einfache Anführungszeichen begrenzt in SQL Zeichenketten. Doppelte Anführungszeichen begrenzen in SQL normalerweise *keine* Zeichenketten, sondern Bezeichner wie zum Beispiel Tabellen- oder Spaltennamen. MySQL in der Standardkonfiguration macht etliche Ausnahme vom SQL-Standard.

der query für die Funktion wird gebastelt aus zwei Arrays $keys und $vals:

sowas:

$query_keys = " (".implode(",", $keys).")";
$query_vals = " VALUES(".implode(" , ", $vals).")";
$query = "INSERT INTO '$table'".$query_keys.$query_vals;

  
solltest Du \*nicht\* machen :-)  
  
a) Dein SQL-Statement ist syntaktisch nicht korrekt.  
   Wenn Du den Tabellennamen in Anführungszeichen packst, dann in  
   doppelte Anführungszeichen (ANSI-Quotes).  
  
b) Gleiches gilt für Deine Spaltennamen, die Du \*hmmm\* etwas ungewöhnlich  
   als "keys" bezeichnest.  
  
c) Die Spalteninhalte sind mit [escapeString](http://www.php.net/manual/de/sqlite3.escapestring.php) zu behandeln.  
   Dein Code sieht \*keine\* Begrenzer für Deine Werte vor.  
   Bei Zeichenketten benötigst Du zwingend das einfache Anführungszeichen  
   als Begrenzer. Nein, dieses Begrenzerzeichen ist \*nicht\* Bestandteil  
   des Wertes.  
   Bei NULL darfst Du keine Begrenzer verwenden.  
  
Fazit:  
So einfach kannst Du Dir nicht eine Funktion zusammenstricken, die ein  
beliebiges INSERT-Statement erzeugt.  
  
Ich fürchte, Du hast dedlfix' Kontextwechselartikel noch nicht so recht verstanden :-(  
  
  
Freundliche Grüße  
  
Vinzenz