Prepared Statements sind gar nicht sicherer


Es ist eine weit verbreitete Ansicht, dass SQL-Injections mit Prepared Statements sicher verhindert werden können (es gibt glaube ich auch nicht wenige Leute die glauben Prepared Statements wären dazu da um SQL-Injections zu verhindern) und man diese daher dem klassischen zusammenbasteln von Queries unbedingt vorziehen müsse. Das stimmt so leider nicht, und tragischerweise tappen gerade die Entwickler in die Falle, die sich durch die unreflektierte Verwendung von Prepared Statements besonders sicher fühlen – und zwar genau dann, wenn sie einzelne Variablen nicht bind()’en sondern ungeprüft in’s prepare() packen.

Beispiel aus der Praxis:

$statement = DB::prepare("SELECT c1, c2 FROM t WHERE c1 = :sVal1 LIMIT 0, " . $_REQUEST['limit']);
$statement->bind(':sVal1', $_REQUEST['sVal1'], PDO::PARAM_STR);

…ist natürlich genauso schlimm wie…

mysql_query('SELECT c1, c2 FROM t WHERE c1 = "' . mysql_escape_string($_REQUEST['sVal1']) . '" LIMIT 0, " . $_REQUEST['limit']);

Komfortfeature für Hacker ist dann – zumindest bei PDO vs. mysql_query() – auch noch die defaultmäßige Unterstützung von multiple queries. $_REQUEST[‚limit‘] = ‚; DELETE FROM t;‘; würde somit beim ersten Snippet in der Regel funktionieren, beim zweiten dagegen unter normalen Umständen nicht.

Der einzige Schutz vor SQL-Injections ist und bleibt eben doch das konsequente Escapen/Validieren aller Variablen. Das wiederum ist eine Frage des Entwicklers und nicht die des verwendeten Abstraktionslayers.

Advertisements

Ein Gedanke zu “Prepared Statements sind gar nicht sicherer

  1. Na, wenn der typische DAU Sie nicht „bind()’et“ dann liegt das wohl an seinem Unverständniss von Prepare (Vorbereiten!).

    MfG

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s