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%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.
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.
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.
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>
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 .