Ich habe gehört, dass "jeder" parametrisierte SQL-Abfragen verwendet, um sich vor SQL-Injection-Angriffen zu schützen, ohne dass jede Benutzereingabe überprüft werden muss.
Wie machst Du das? Erhalten Sie dies automatisch, wenn Sie gespeicherte Prozeduren verwenden?
Mein Verständnis ist also nicht parametrisiert:
cmdText = String.Format("SELECT foo FROM bar WHERE baz = '{0}'", fuz)
Würde dies parametrisiert werden?
cmdText = String.Format("EXEC foo_from_baz '{0}'", fuz)
Oder muss ich etwas umfangreicheres tun, um mich vor SQL-Injection zu schützen?
With command
.Parameters.Count = 1
.Parameters.Item(0).ParameterName = "@baz"
.Parameters.Item(0).Value = fuz
End With
Gibt es neben den Sicherheitsaspekten noch weitere Vorteile bei der Verwendung parametrisierter Abfragen?
Update: Dieser großartige Artikel wurde in einer der Fragen von Grotok verlinkt. http://www.sommarskog.se/dynamic_sql.html
sql
vb.net
sql-parametrized-query
Jim zählt
quelle
quelle
Antworten:
Ihr EXEC-Beispiel würde NICHT parametrisiert. Sie benötigen parametrisierte Abfragen (in einigen Kreisen vorbereitete Anweisungen), um zu verhindern, dass Eingaben wie diese Schaden anrichten:
Versuchen Sie, dies in Ihre Fuz-Variable einzufügen (oder nicht, wenn Sie Ihre Stehtabelle schätzen). Auch subtilere und schädlichere Abfragen sind möglich.
Hier ist ein Beispiel, wie Sie Parameter mit SQL Server ausführen:
Gespeicherten Prozeduren wird manchmal die Verhinderung der SQL-Injection zugeschrieben. Meistens müssen Sie sie jedoch immer noch mit Abfrageparametern aufrufen, oder sie helfen nicht. Wenn Sie ausschließlich gespeicherte Prozeduren verwenden , können Sie die Berechtigungen für SELECT, UPDATE, ALTER, CREATE, DELETE usw. (fast alles außer EXEC) für das Anwendungsbenutzerkonto deaktivieren und auf diese Weise einen gewissen Schutz erhalten.
quelle
cmd.Parameters.Add("@Baz", SqlDbType.VarChar, 50).Value = Baz
bitte näher erläutern ?@Baz
vom Typvarchar(50)
, dem der Wert derBaz
Zeichenfolge zugewiesen wird .AddWithValue("@Baz", Baz)
, Sie könnten das tun, aber Sie sollten es nicht tun , insbesondere weil das Konvertieren von Zeichenfolgenwerten, die standardmäßignvarchar
dem tatsächlichenvarchar
Typ zugeordnet sind, einer der häufigsten Orte ist, die die in diesem Link genannten Effekte auslösen können.Auf jeden Fall der letzte, dh
Parametrisierte Abfragen haben zwei Hauptvorteile:
quelle
Sie möchten mit Ihrem letzten Beispiel fortfahren, da dies das einzige ist, das wirklich parametrisiert ist. Neben Sicherheitsbedenken (die weitaus häufiger auftreten als Sie vielleicht denken) ist es am besten, ADO.NET die Parametrisierung durchführen zu lassen, da Sie nicht sicher sein können, ob für den übergebenen Wert einfache Anführungszeichen erforderlich sind oder nicht, ohne die
Type
einzelnen Parameter zu überprüfen .[Bearbeiten] Hier ist ein Beispiel:
quelle
Die meisten Leute würden dies über eine serverseitige Programmiersprachenbibliothek tun, wie PHPs PDO oder Perl DBI.
Zum Beispiel in PDO:
Dadurch wird sichergestellt, dass Ihre Daten nicht zum Einfügen in die Datenbank verwendet werden.
Ein Vorteil ist, dass Sie eine Einfügung mit einer vorbereiteten Anweisung viele Male wiederholen können, um einen Geschwindigkeitsvorteil zu erzielen.
Zum Beispiel könnte ich in der obigen Abfrage die Anweisung einmal vorbereiten und dann das Erstellen des Datenarrays aus einer Reihe von Daten durchlaufen und die Ausführung -> so oft wie nötig wiederholen.
quelle
Ihr Befehlstext muss wie folgt aussehen:
Fügen Sie dann Parameterwerte hinzu. Auf diese Weise wird sichergestellt, dass der Wert con nur als Wert verwendet wird, während dies bei der anderen Methode der Fall ist, wenn die Variable fuz auf gesetzt ist
Kannst du sehen, was passieren könnte?
quelle
Hier ist eine kurze Klasse, um mit SQL zu beginnen, und Sie können von dort aus erstellen und zur Klasse hinzufügen.
MySQL
MS SQL / Express
quelle