Bereiten vorbereitende Anweisungen Ihre Datenbank vor?

8

Ich weiß, dass diese Frage vielleicht von einigen von Ihnen geschlossen wird, aber meine Frage kam von Ihnen und Ihren Antworten. Ich lese die letzten zwei Stunden Fragen und Antworten für SQL Injektionen und wie Sie Ihre Datenbank schützen. Das gleiche gilt für die riesige Menge an Webseiten und Tutorials, die ich gesehen habe.

Ich fand heraus, dass die Hälfte der Leute behauptet, dass prepare-Anweisungen Ihre db sichern, und die anderen 50 behaupten, dass dies nicht der Fall ist.

Auf der anderen Seite habe ich gelesen, dass mysql_real_escape_string die Aufgabe erledigt, und andere Leute sagen, dass es das nicht ist.

Meine Frage ist, wem ich glauben soll?

Ist dies außerdem eine richtige Vorbereitungserklärung?

%Vor%     
EnexoOnoma 24.08.2011, 13:09
quelle

4 Antworten

11

Vorbereitete Aussagen nicht. Gebundene Parameter sichern die Anweisung (nicht die Datenbank als Ganzes), solange alle nicht vertrauenswürdigen Daten über einen Parameter übergeben und nicht in die Anweisung interpoliert werden. Wenn Personen vorbereitete Anweisungen verwenden, verwenden sie fast immer auch gebundene Parameter, so dass die beiden Namen oft zusammengeführt werden.

  1. Vorbereiten der Anweisung
  2. Ausführen einer Anweisung mit Variablen als zusätzliche Argumente

mysql_real_escape_string macht fast immer den Job, aber da es dem Prozess zusätzliche Schritte hinzufügt, ist es anfälliger für menschliche Fehler.

  1. Escape jede Variable
  2. Verkettete Variablen in eine SQL-Anweisung
  3. Laufanweisung
Quentin 24.08.2011, 13:12
quelle
12

Beide. Vorbereitete Anweisungen schützen Sie vor SQL-Injektionen, wenn und nur wenn Sie sie korrekt verwenden. Wenn Sie vorbereitete Anweisungen verwenden, hilft das nicht, wenn Sie zum Beispiel noch Variablen für Tabellen- / Spaltennamen interpolieren.

%Vor%     
Mchl 24.08.2011 13:13
quelle
2

Das ist eine gute Diskussion. Ihre Frage geht davon aus, dass es eine Technik gibt, die Ihre Datenbank "sichert". In der Tat gibt es keine einzige Technik, die für alle Fälle am besten ist. Sie müssen also lernen, mehrere Lösungen in verschiedenen Situationen zu verwenden.

  • Escape-Literalwerte
  • Parameter-Platzhalter in vorbereiteten Abfragen
  • Whitelist-Karten

Siehe meine Präsentation SQL-Injektions-Mythen und Irrtümer , wo ich Einzelheiten zu allem darlege, was Sie tun müssen wissen, um gegen SQL-Injektion zu verteidigen.

Ich behandle auch die SQL-Injection in meinem Buch SQL Antipatterns: Vermeidung von Fallstricken der Datenbankprogrammierung . p>     

Bill Karwin 24.01.2012 07:04
quelle
0

Es gibt bestimmte Fälle, in denen vorbereitete Anweisungen nicht verwendet werden können. Wenn Sie beispielsweise den Inhalt einer IN() -Klausel dynamisch generieren müssen, können Sie WHERE col IN (?) nicht ausführen, wenn Sie die durch Kommas getrennten Werte dynamisch ausgewählt haben, um in die IN() zu gelangen. Wenn Sie die Spaltenliste in Ihrer SELECT -Klausel dynamisch generieren müssen, müssen Sie dies tun, indem Sie die SQL-Zeichenfolge erstellen.

Das Endergebnis ist, beide haben ihren Platz. Vorbereitete Anweisungen eignen sich hervorragend für vorgegebene Abfragen oder Abfragen, die mehrfach ausgeführt werden müssen. Escaped dynamisches SQL ist ausgezeichnet, wenn 1) Sie maximale Flexibilität haben müssen und 2) Sie nicht vergessen, alle Ihre Eingabe zu entgehen .

    
Michael Berkowski 24.08.2011 13:15
quelle

Tags und Links