Klaus Mock: Über die Verwendung von Anführungszeichen in SQL

Beitrag lesen

Hallo,

...weil es bei MySQL erlaubt ist und die Sache dadurch erheblich vereinfacht. Für den Fall, dass doch keine Zahl drinsteht, gibt's wenigstens auch keine Injektion.

Allerdings verbirgt sich dadurch auch im Statement die Tatsache, dass bestimmte Felder numerisch sind.

Ausserdem stelle ich mir die Frage wie die Datenbank (unabhängig vom Hersteller oder von der Version) beispielsweise auf folgendes Statement reagiert:

UPDATE tabelle SET
   numeric1 = '1test';
   numeric2 =  'test'
   WHERE id = '123test';

Siehe hierzu auch [pref:t=69312&m=398925]

Ich bevorzuge bei Parametern an sich sowieso Databinding. Und in den Programmiersprachen, mit denen ich arbeite, sind Datenbankschnittstellen verfügbar, die das Maskieren von "L'Oreal" Datenbank-spezifisch beim Databinding automatisch erledigen. Diesen Komfort gönne ich mir;-)

Anderenefalls müsste jeder als numerisch erwartete Wert vorher auch auf numerisch überprüft werden.

_Das_ sollte bei externen Daten (Benutzereingaben, Textdateien usw.) sowieso passieren. Allein schon um unschöne oder nichtssagende Frehlermeldungen zu vermeiden.

Eine Maskierung reicht gegen Injektionsgefahr nicht aus.

Nur Anführungszeichen helfen da auch nicht:

$numeric = "1', secret='0";
$id = "123' OR id > '-999999";

$sql = "UPDATE tabelle SET public_numeric ='$numeric' WHERE id = '$id'";
$sql2 = "UPDATE tabelle SET public_numeric =$numeric WHERE id = $id";

Ergebnis:

$sql == "UPDATE tabelle SET public_numeric ='1', secret='0' WHERE id = '$id'"
-> SQL-Syntax ist OK

$sql2 = "UPDATE tabelle SET public_numeric =1', secret='0 WHERE id = 123' OR id > '-999999"
-> Wenn sie hier auch noch von der Datenbank akzeptiert wird, solltest Du das DBMS dringen wechseln;-)

Nochmals: Kann mir irgendjemand _wirklich_ gute Gründe für diese Vorgehensweise nennen?

Grüße
  Klaus