Frage SQL-Injektionen mit vorbereiteten Anweisungen?


Wenn ich mich richtig erinnere, denke ich, dass Jeff im Stack Overflow Podcast eine mögliche Schwäche in SQL vorbereiteten Aussagen erwähnt hat. Ich frage mich, auf welche Schwäche (n) er sich bezieht? War es vielleicht gerade so? ungeeignete Verwendung oder etwas Unheimlicheres?

Der Podcast, zu meiner Erinnerung, ging nicht tiefer auf das Thema ein, es war nur eine Bemerkung.


11
2018-03-24 17:26


Ursprung


Antworten:


Ich denke, was er sagte, war, dass SQL Server, wenn Sie Prepared Statements verwenden, Ihren Abfrageausführungsplan zwischenspeichern konnte. Selbst wenn Sie einige Parameter der ausgeführten Abfrage ändern, könnte der Server den falschen (wahrscheinlich zwischengespeicherten) Ausführungsplan auswählen das würde sehr schlecht funktionieren.

Er erwähnte auch eine neue Funktion von SQL Server 2008, um die Engine dazu zu zwingen, Ausführungspläne neu zu bewerten, mit denen er diese Situation überwunden hat.

Mit vorbereiteten Aussagen ist das einzige Problem, das ich habe, das. Betrachten Sie den folgenden Java-Code:

String sql = "select * from table where name like ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "PATTERN%");
ResultSet rs = pstmt.executeQuery();

Hier würden Sie erwarten, dass, wenn Sie einen Index für die Tabelle (Name) haben, dieser vom Abfrageplan verwendet wird. Nun, wird es nicht. Da PraparedStatement vorkompilieren und das Schlimmste erwarten muss: zum Beispiel '% PATTERN%'. Also, es wird nicht optimiert. Es hat eine Weile gedauert, bis ich das herausgefunden hatte. Es verursachte meine Datenbank zu leiden. :(

Ich hoffe es hilft.


6
2018-03-24 17:37



Jenseits der normalen SQL-Injektion (was wir als erste Ordnung bezeichnen könnten) gibt es sekundäre Ebenen. Zum Beispiel ist es nicht ungewöhnlich, dass gespeicherte Prozeduren String-Verkettungen verwenden, um eine Abfrage zu erstellen, die dann ausgeführt wird. Wenn das Ergebnis der abgerufenen Feldwerte in einer solchen Verkettung enthalten ist, besteht die Gefahr einer Injektion.


2
2018-03-24 17:36



Wenn die vorbereitete Anweisung die Parameter dynamisch in irgendeiner Weise konstruiert hat, dann wäre dies höchstwahrscheinlich die Quelle der Schwäche.

Wenn Sie eine geeignete Datenbankbibliothek mit getesteten Klassen zum Einstellen von Parametern verwenden, dann öffnen Sie sich zu keiner Zeit für eine SQL-Injektion, vorbereitete Anweisung oder nicht.

Denken Sie daran, nur weil eine Anweisung vorbereitet wurde oder weil Sie eine gespeicherte Prozedur verwenden, bedeutet dies nicht, dass Sie vor Injektionsattacken sicher sind. Nur wenn Sie den Code des Datenbankanbieters verwenden, der die Eingabe von Parametern bereinigt (und auf alle Parameter anwendet, die verwendet werden können), erhalten Sie Schutz vor SQL-Injection.


1
2018-03-24 17:36



Ich habe dem Podcast nicht zugehört, aber meiner Erfahrung nach kommt nur gutes aus vorbereiteten Aussagen. Es verbessert oft die Leistung der Anwendung und verhindert die SQL-Injektion (wenn richtig verwendet, nicht als das zweite Beispiel in Ihrer Verbindung).


0
2018-03-24 17:35