Der Unterschied wird als vernachlässigbar angesehen.
Dennoch muss man von nativ vorbereiteten Statements unterscheiden von der allgemeinen Idee einer vorbereiteten Erklärung.
Ersteres ist nur eine Form der Ausführung von Abfragen, die von den meisten DBMS unterstützt wird, erklärt hier
. Seine Verwendung kann in Frage gestellt werden.
Letzteres ist eine allgemeine Idee, tatsächliche Daten durch einen Platzhalter zu ersetzen, was eine weitere Verarbeitung der ersetzten Daten impliziert. Es ist in der Programmierung weit verbreitet, ein bekanntes printf()
Funktion ist ein Beispiel. Und dieser letztere Ansatz muss IMMER verwendet werden, um eine Abfrage gegen eine Datenbank auszuführen , egal ob es durch nativ vorbereitete Anweisungen unterstützt wird oder nicht. Denn:
- Die
- vorbereitete Anweisung macht eine korrekte Formatierung (oder Handhabung) unvermeidlich . Die
- vorbereitete Anweisung führt die richtige Formatierung (oder Verarbeitung) an der einzig richtigen Stelle durch - direkt vor der Abfrageausführung, nicht woanders, unsere Sicherheit wird sich also nicht auf solch unzuverlässige Quellen wie
- verlassen
- irgendein 'magisches' PHP-Feature, das die Daten eher verdirbt als sicher macht.
- guter Wille eines (oder mehrerer) Programmierer, die entscheiden können, unsere Variable irgendwo im Programmablauf zu formatieren (oder nicht zu formatieren). Das ist der Punkt von großer Bedeutung.
- Die vorbereitete Anweisung beeinflusst genau den Wert, der in die Abfrage eingeht, aber nicht die Quellvariable, die intakt bleibt und im weiteren Code verwendet werden kann (um per E-Mail gesendet oder auf dem Bildschirm angezeigt zu werden).
- Die vorbereitete Anweisung kann den Anwendungscode erheblich verkürzen, da die gesamte Formatierung im Hintergrund erfolgt (*nur wenn der Treiber dies zulässt).
Selbst wenn Sie keine nativen vorbereiteten Anweisungen verwenden möchten (was völlig in Ordnung ist), müssen Sie Ihre Abfragen immer mit Platzhaltern anstelle der tatsächlichen Daten erstellen. Zu diesem Zweck können Sie PDO verwenden , das genau wie oben beschrieben funktioniert - standardmäßig wird es nur emuliert vorbereitet , bedeutet, dass eine reguläre SQL-Abfrage aus vorbereiteten Abfragen und Daten erstellt und dann für die Datenbank ausgeführt wird.
Allerdings fehlt PDO die Unterstützung für viele wichtige Datentypen, wie etwa Identifier oder ein Array – daher können Sie nicht immer Platzhalter verwenden und machen so eine Injektion durchaus möglich. Glücklicherweise safeMysql hat Platzhalter für jeden Datentyp und ermöglicht Ihnen, Abfragen sicher auszuführen.