Warum bevorzugen wir immer die Verwendung von Parametern in SQL-Anweisungen?
Ich bin sehr neu in der Arbeit mit Datenbanken. Jetzt kann ich schreiben SELECT
, UPDATE
, DELETE
, und INSERT
Befehle. Aber ich habe gesehen, viele Foren, in denen wir lieber schreiben:
SELECT empSalary from employee where salary = @salary
...statt:
SELECT empSalary from employee where salary = txtSalary.Text
Warum tun wir immer lieber, Parameter zu verwenden, und wie verwende ich Sie?
Wollte ich wissen, die Verwendung und die Vorteile der ersten Methode. Ich habe sogar gehört, SQL-injection, aber ich nicht ganz verstehen. Ich weiß gar nicht, ob der SQL-Injektion in Bezug auf meine Frage.
Kommentar zu dem Problem - Öffnen
Du hast Recht, dies ist im Zusammenhang mit SQL-injection. Der Umgang mit Parametern ist in der Regel die Verantwortung, welche Sprache/framework in deinem Programm ausgeführt wird, und können Sprache abhängig. Bitte senden Sie Ihre RDBMS (hilfreich), und ORM-Rahmens (nicht notwendig).
Ich bin mit C# als Programmiersprache und Sql Server 2008 als Datenbank. Ich bin mit Microsoft dotNet framework 4.0. Ich bin wirklich wirklich tut mir Leid, dass ich bin nicht sicher, was Sie Fragen (RDBMS oder ORM), vielleicht kannst du mir meine RDBMS-und ORM-framework-Versionen jetzt :-). Vielen Dank
RDBMS ist die Datenbank, in deinem Fall SQL Server 2008. Ihre ORM ist die Methode, mit der Sie den Zugriff auf Ihre Datenbank, in diesem Fall, ADO.NET. Andere includ LINQ to SQL und Entity Framework. In der Tat, sobald Sie lernen die Grundlagen der ADO.NET und SQL sind, empfehle ich die Verwendung von ein ORM wie LINQ oder EF, da Sie kümmern sich um viele der Probleme, denen Sie begegnen würde, durch manuelles schreiben von SQL.
InformationsquelleAutor der Frage Sandy | 2011-09-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Using-Parameter hilft zu verhindern, dass SQL-Injection-Angriffe, wenn die Datenbank in Verbindung mit einer Programm-Benutzeroberfläche wie ein desktop-Programm oder web site.
In deinem Beispiel, kann ein Benutzer direkt SQL-code auf Ihre Datenbank, indem er Aussagen in
txtSalary
.Zum Beispiel, wenn Sie wurden schreiben
0 OR 1=1
die ausgeführte SQL wärewobei alle empSalaries zurückgegeben werden.
Weiter, die ein Benutzer durchführen könnte weit schlimmer-Befehle für Ihre Datenbank, einschließlich löschen, Wenn Sie schrieb
0; Drop Table employee
:Den Tisch
employee
würde dann gelöscht werden.In Ihrem Fall, es sieht aus wie Sie verwenden .NET. Die Verwendung von Parametern ist so einfach wie:
C#
VB.NET
Bearbeiten 2016-4-25:
Als pro George Stocker Kommentar, änderte ich den Beispielcode nicht verwenden
AddWithValue
. Auch im Allgemeinen ist es empfehlenswert, dass Sie wickelnIDisposable
s inusing
Aussagen.InformationsquelleAutor der Antwort Chad Levy
Du hast Recht, dies ist im Zusammenhang mit SQL-injection, das ist eine Verwundbarkeit, die einem malicioius Benutzer zum ausführen von beliebigen Anweisungen gegen die Datenbank. Diese alte Zeit Lieblings - XKCD-comic veranschaulicht das Konzept:
In deinem Beispiel, wenn Sie gerade verwenden:
Sind Sie offen für SQL-injection. Zum Beispiel, sagen, jemand betritt txtSalary:
Wenn Sie diese Abfrage ausführen, wird ein
SELECT
und einUPDATE
oderDROP
oder was auch immer Sie wollten. Die--
am Ende einfach Kommentare aus dem rest der Abfrage, die nützlich sein würde in den Angriff, wenn Sie die Verkettung alles nachtxtSalary.Text
.Der richtige Weg ist die Verwendung von parametrisierten Abfragen, z.B. (C#):
Mit, dass, können Sie sicher die Abfrage auszuführen.
Referenz zur Vermeidung von SQL-injection in mehreren anderen Sprachen überprüfen bobby-tables.com, eine website verwaltet von einer ALSO Benutzer.
InformationsquelleAutor der Antwort NullUserException
In Sql, wenn jedes Wort mit dem @ - Zeichen es bedeutet, dass es variabel ist und wir diese variable verwenden, um Wert in es und verwenden Sie es auf die Nummer-Gebiet auf dem gleichen sql-script, weil es nur beschränkt auf die einzelnen Skripts Sie können zwar erklären Menge von Variablen des gleichen Typs und der name auf viele script. Wir verwenden diese Variablen in der gespeicherten Prozedur viel, weil die gespeicherte Prozedur sind vorkompilierte Abfragen und dann können wir auch Werte in diese variable aus Skript -, desktop-und Webseiten für weitere Informationen Lesen Sie Deklarieren Sie Lokale Variable, Gespeicherte Sql-Prozedur und sql-Injektionen.
Lesen Sie auch Schutz vor sql-Injektion es führen wird, wie schützen Sie Ihre Datenbank.
Hoffe, dass es Euch helfen zu verstehen, auch jede Frage, Kommentar mich.
InformationsquelleAutor der Antwort Emaad Ali
Anderen Antworten abdecken, warum die Parameter sind wichtig, aber es gibt einen Nachteil! In .net, gibt es mehrere Methoden für die Erstellung von Parameter (- Add, AddWithValue), aber Sie alle verlangen, dass Sie sich sorgen zu machen, unnötig, über die parameter name, und Sie verringern die Lesbarkeit der SQL im code. Rechts, wenn Sie versuchen zu meditieren, die auf die SQL, die Sie benötigen zu jagen, um oben oder unten, um zu sehen, welcher Wert wurde im parameter.
Möchte ich in aller Bescheidenheit behaupten, meine kleine SqlBuilder Klasse ist die eleganteste Art, zu schreiben, parametrisierte Abfragen. Ihr code wird wie folgt Aussehen...
C#
Ihr code wird kürzer und viel besser lesbar. Sie brauchen noch nicht einmal zusätzliche Leitungen, und, wenn Sie Lesen, zurück, Sie brauchen nicht auf die Jagd um für den Wert der Parameter. Die Klasse, die Sie brauchen, ist hier...
InformationsquelleAutor der Antwort bbsimonbb
Zusätzlich zu den anderen Antworten muss hinzufügen, dass Parameter, die nicht nur hilft zu verhindern, dass sql-injection-aber kann die Leistung von Abfragen. Sql server-caching-parametrisierte Abfrage-Pläne und wiederverwenden auf wiederholte Anfragen der Ausführung. Wenn Sie nicht parametrisiert Ihre Abfrage dann sql server zusammenstellen würde neue plan für jede Abfrage(mit Ausschluss) Ausführung wenn text der Abfrage abweichen würde.
Mehr Informationen über die query-caching-plan
InformationsquelleAutor der Antwort Oleg
Zwei Jahre nach meine erste, ich bin recidivating...
Warum ziehen wir Parameter? SQL-injection ist natürlich ein großer Grund, aber könnte es sein, dass wir uns heimlich danach sehnen, wieder zurück zu SQL als Sprache. SQL in string-literalen ist schon eine seltsame kulturelle Praxis, aber mindestens Sie können kopieren und fügen Sie Ihre Anfrage in das management-studio. SQL dynamisch aufgebaut mit der host-Sprache Vergleichsoperatoren und Kontrollstrukturen, wenn SQL hat Vergleichsoperatoren und Kontrollstrukturen, ist nur level 0 Barbarei. Sie müssen führen Sie Ihre app im debug, oder mit einer Spur, um zu sehen, was von SQL, die es erzeugt.
Don ' T stop mit nur Parameter. Gehen alle den Weg und nutzen QueryFirst (disclaimer: was ich schrieb). Ihre SQL Leben in einem .sql-Datei. Sie Bearbeiten es in die fabelhafte TSQL-editor mit syntax-Validierung und Intellisense für Ihre Tabellen und Spalten. Zuordnen können Sie test-Daten in den speziellen Kommentaren Abschnitt, und klicken Sie auf "play", um führen Sie Ihre Abfrage direkt in das Fenster. Erstellen Sie einen parameter genauso einfach wie mit "@myParam" in Ihrer SQL. Dann, jedes mal, wenn Sie sparen, QueryFirst generiert die C# - wrapper für Ihre Abfrage. Ihre Parameter pop-up, stark typisiert sind, die als Argumente an die Execute () - Methoden. Ihre Ergebnisse zurückgegeben werden, in ein IEnumerable oder die Liste der stark typisierten POCOs, die Arten erzeugt aus dem schema von der Abfrage zurückgegebenen. Wenn Ihre Abfrage nicht ausgeführt werden kann, Ihre app nicht kompiliert. Wenn Sie Ihre db-schema-änderungen und Ihre Abfrage ausgeführt wird, aber einige Spalten verschwinden, die compile-Fehler, Punkte zu die Zeile in Ihrem code, die versucht, Zugriff auf die Daten fehlen. Und es gibt noch zahlreiche weitere Vorteile. Warum würden Sie wollen, um access-Daten anderen Weg?
InformationsquelleAutor der Antwort bbsimonbb
Alte post, aber wollte sicherstellen Neulinge sind Sie sich bewusst von gespeicherten Prozeduren.
Meine 10c-Wert hier ist, dass, wenn Sie können schreiben Sie Ihre SQL-Anweisung eine gespeicherte Prozedur, dass aus meiner Sicht der optimale Weg. Ich IMMER verwenden Sie gespeicherte Prozeduren und nie in einer Schleife durch Datensätze, die in meinem main-code. Zum Beispiel: SQL-Tabelle > Gespeicherte SQL-Prozeduren > IIS/Dot.NET > Klasse.
Wenn Sie gespeicherte Prozeduren verwenden, können Sie beschränken, dem Benutzer die EXECUTE-Berechtigung nur, wodurch Sicherheitsrisiken.
Ihre gespeicherte Prozedur ist von Natur aus paramerised, und Sie können festlegen, input-und output-Parameter.
Die gespeicherte Prozedur (wenn er zurückkehrt, die Daten via SELECT-Anweisung) zugegriffen werden kann und Lesen in der gleichen Weise wie eine normale SELECT-Anweisung in Ihrem code.
Es läuft auch schneller, wie es kompiliert wird, auf dem SQL Server.
Hab ich auch erwähnen, Sie können mehrere Schritte, z.B. die Tabelle aktualisiert, überprüfen Sie die Werte auf einem anderen DB-server, und dann mal endlich fertig ist, Daten an den client zurückgeben, die alle auf dem gleichen server, und keine Interaktion mit dem client. Das ist also VIEL schneller als mit der Programmierung dieser Logik im code.
InformationsquelleAutor der Antwort Arvin Amir