Wenn *nicht* für die Nutzung von prepared statements?

Ich bin re-engineering eines PHP-driven web site, die verwendet eine minimale Datenbank. Die ursprüngliche version verwendet "pseudo-prepared-statements" (PHP-Funktionen, die Tat, Angebotserstellung und-parameter-Ersatz) zur Verhinderung von injection-Angriffen und separaten Datenbank-Logik-von der Seite der Logik.

Es war selbstverständlich ersetzen diese ad-hoc-Funktionen mit einem Objekt, das verwendet PDO und echten prepared statements, aber nachdem ich meine Lektüre auf Sie, ich bin mir nicht so sicher. PDO-noch immer scheint wie eine gute Idee, aber eines der wichtigsten Verkaufsargumente von prepared statements ist die Möglichkeit zur Wiederverwendung... was ich nie werden. Hier ist mein setup:

  • Die Aussagen sind alle trivial einfach. Die meisten sind in der form SELECT foo,bar FROM baz WHERE quux = ? ORDER BY bar LIMIT 1. Die komplexe Anweisung in der Menge ist einfach, drei so wählt gemeinsam mit UNION ALLs.
  • Jeder Seite Treffer führt bei den meisten eine Anweisung und führt es nur einmal.
  • Ich bin in einer gehosteten Umgebung und daher misstrauisch gegenüber, schlug Ihre Server, indem Sie einen "stress-tests" persönlich.

Gegeben, dass die Verwendung von prepared statements wird mindestens die doppelte Anzahl von Datenbank-Roundtrips ich mache, bin ich besser dran, Sie zu vermeiden? Kann ich PDO::MYSQL_ATTR_DIRECT_QUERY zu vermeiden, den Aufwand für mehrere Datenbank-Reisen, unter Beibehaltung der nutzen der Parametrisierung und-Injektion? Oder tun die binary-Aufrufe verwendet, die von der vorbereiteten Anweisung API durchführen gut genug, im Vergleich zu der Ausführung nicht vorbereitete Abfragen, die ich nicht darum kümmern?

EDIT:

Danke für all die guten Ratschläge, Leute. Dies ist eine, wo ich wünschte, ich könnte mark mehr als eine Antwort als "akzeptiert" — viele verschiedene Perspektiven. Letztlich, obwohl, ich habe zu geben rick seinen wegen... ohne seine Antwort hätte ich seelig off gegangen und erledigt das völlig Falsch, Was auch nach folgenden jeden Ratschlag. 🙂

Emulierte vorbereitete Anweisungen, die ist es!

  • Vorsicht: PDO emulierte vorbereitete Anweisungen sind anfällig für SQL-injection, wenn der Zeichensatz wird zur Laufzeit geändert. Siehe die Antwort und die Antwort für eine Erläuterung.
  • Es ist ganz einfach: Wenn Sie wissen, der string kommt aus der Anwendung und nicht manipuliert werden können durch einen Benutzer, dann gibt es keine Notwendigkeit für vorbereitete Anweisungen, da gibt es nichts zu injizieren. Wenn Sie nicht sicher sind (schlecht, aber in größeren Projekten, die nicht vermeidbaren) verwenden Sie eine vorbereitete Anweisung.
InformationsquelleAutor Ben Blank | 2009-02-11
Schreibe einen Kommentar