Es gibt tatsächlich zwei Fragen in einer. Und die Frage aus dem Titel hat sehr wenig mit Bedenken zu tun, die das OP in den nachfolgenden Kommentaren geäußert hat.
Obwohl mir klar ist, dass es für das OP auf den jeweiligen Fall ankommt, ist es für die Leser von Google wichtig, die allgemeinere Frage zu beantworten, die wie folgt formuliert werden kann: "Ist die Verkettung so sicher wie vorbereitete Aussagen, wenn ich mich vergewissere?" dass jedes Literal, das ich verkette, sicher ist? ". Ich möchte mich also auf Letzteres konzentrieren. Und die Antwort ist
Auf jeden Fall NEIN.
Die Erklärung ist nicht so direkt, wie die meisten Leser es gerne hätten, aber ich werde mein Bestes geben.
Ich habe eine Weile darüber nachgedacht, was zu dem Artikel führte (obwohl er auf der PHP-Umgebung basiert), in dem ich versuchte, alles zusammenzufassen. Mir ist der Gedanke gekommen, dass die Frage des Schutzes vor SQL-Injection häufig in Bezug auf einige verwandte, aber engere Themen wie das Entweichen von Zeichenfolgen, das Casting von Typen und dergleichen nicht berücksichtigt wird. Obwohl einige der Maßnahmen für sich genommen als sicher angesehen werden können, gibt es weder ein System noch eine einfache Regel, die befolgt werden muss. Das macht es sehr rutschig und belastet die Aufmerksamkeit und Erfahrung des Entwicklers zu sehr.
Die Frage der SQL-Injection kann nicht auf ein bestimmtes Syntaxproblem vereinfacht werden. Es ist breiter als der durchschnittliche Entwickler gedacht. Es ist auch eine methodische Frage. Es ist nicht nur "Welche bestimmte Formatierung müssen wir anwenden", sondern auch " Wie es gemacht werden muss".
(Unter diesem Gesichtspunkt ist ein Artikel von Jon Skeet, der in der anderen Antwort zitiert wird, eher schlecht als gut, da er sich wieder auf einen Randfall konzentriert, sich auf ein bestimmtes Syntaxproblem konzentriert und das Problem überhaupt nicht anspricht.)
Wenn Sie versuchen, die Frage des Schutzes nicht als Ganzes, sondern als eine Reihe verschiedener Syntaxprobleme zu behandeln, stehen Sie vor einer Vielzahl von Problemen.
- Die Liste der möglichen Formatierungsoptionen ist wirklich riesig. Mittel, die man leicht übersehen kann. Oder verwirren Sie sie (indem Sie beispielsweise eine Zeichenfolge verwenden , die als Kennung dient ).
- Verkettung bedeutet, dass alle Schutzmaßnahmen vom Programmierer und nicht vom Programmierer durchgeführt werden müssen. Dieses Problem allein führt zu mehreren Konsequenzen:
- Eine solche Formatierung erfolgt manuell. Manuell bedeutet extrem fehleranfällig. Man könnte einfach vergessen, sich zu bewerben.
- Darüber hinaus besteht die Versuchung, Formatierungsverfahren in eine zentralisierte Funktion zu verschieben, die Dinge noch mehr durcheinander zu bringen und Daten zu verderben, die nicht in die Datenbank gelangen.
- Wenn mehr als ein Entwickler beteiligt ist, multiplizieren sich die Probleme mit dem Faktor zehn.
- Wenn Verkettung verwendet wird, kann man eine potenziell gefährliche Abfrage nicht auf einen Blick erkennen: Sie alle sind potenziell gefährlich!
Im Gegensatz zu diesem Durcheinander sind vorbereitete Aussagen in der Tat der Heilige Gral:
- Es kann in Form einer einfachen Regel ausgedrückt werden, die leicht zu befolgen ist.
- Es ist im Wesentlichen eine untrennbare Maßnahme, dh der Entwickler kann sich nicht einmischen und den Prozess freiwillig oder unfreiwillig verderben.
- Der Schutz vor Injektion ist eigentlich nur ein Nebeneffekt der vorbereiteten Aussagen, deren eigentlicher Zweck darin besteht, syntaktisch korrekte Aussagen zu erstellen. Und eine syntaktisch korrekte Aussage ist 100% injektionssicher. Trotzdem muss unsere Syntax trotz aller Injektionsmöglichkeiten korrekt sein.
- Wenn es rundum verwendet wird, schützt es die Anwendung unabhängig von der Erfahrung des Entwicklers. Angenommen, es gibt eine Sache, die als Injektion zweiter Ordnung bezeichnet wird . Und eine sehr starke Täuschung, die lautet: "Um alle vom Benutzer bereitgestellten Eingaben zu schützen, entkommen Sie ". Zusammen führen sie zur Injektion, wenn sich ein Entwickler die Freiheit nimmt, zu entscheiden, was geschützt werden muss und was nicht.
(Als ich weiter nachdachte, stellte ich fest, dass der aktuelle Satz von Platzhaltern nicht für die Anforderungen des realen Lebens ausreicht und erweitert werden muss, sowohl für die komplexen Datenstrukturen wie Arrays als auch für SQL-Schlüsselwörter oder -Kennungen, die manchmal zu den hinzugefügt werden müssen Abfrage auch dynamisch, aber ein Entwickler bleibt für einen solchen Fall unbewaffnet und muss auf die Verkettung von Zeichenfolgen zurückgreifen, aber das ist eine andere Frage.
Interessanterweise wird die Kontroverse dieser Frage durch die sehr kontroverse Natur des Stapelüberlaufs provoziert. Die Idee der Website besteht darin, bestimmte Fragen von Benutzern zu verwenden, die direkt nachfragen , um das Ziel einer Datenbank mit allgemeinen Antworten zu erreichen, die für Benutzer geeignet sind, die aus der Suche stammen . Die Idee ist nicht schlecht , per se , aber es funktioniert nicht in einer Situation wie dieser: wenn ein Benutzer eine fragt sehr engen Frage , vor allem in einem Streit um ein Argument zu bekommen mit einem Kollegen (oder zu entscheiden , ob es sich lohnt , den Code zu Refactoring). Während die meisten erfahrenen Teilnehmer versuchen, eine Antwort zu schreiben, denken Sie an die Mission of Stack Overflow insgesamt, was ihre Antwort für so viele Leser wie möglich gut macht, nicht nur für das OP.