Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verhindert dieser Code die SQL-Injection?

Als Antwort auf Ihre direkte Frage:Verhindert dieser Code die SQL-Einschleusung:Nein

Hier ist der Beweis – schieben Sie diesen String durch die Methode PrepareString:

Dim input = "'" & Chr(8) & "; Drop Table TableName; - " & Chr(8) & "-"
Dim output = PrepareString(input)

Console.WriteLine(input)
Console.WriteLine(output)

Ich habe die von Ihnen gepostete GetRecord-Methode geändert, um die vollständig vorbereitete SQL-Zeichenfolge zurückzugeben, anstatt den Datensatz aus der Datenbank abzurufen:

Console.WriteLine(GetRecord(output))

Und das ist die Ausgabe

Input  = ; Drop Table TableName; --
Output = '; Drop Table TableName; --
Query  = SELECT * FROM TableName WHERE Key = ''; Drop Table TableName; --'

Fügen Sie 1 zusätzliche Codezeile hinzu:

My.Computer.Clipboard.SetText(input)

Und Sie haben die Zeichenfolge, die Sie benötigen, direkt in Ihre Zwischenablage kopiert, um sie in Ihr Eingabefeld auf der Website einzufügen, um Ihre SQL-Injektion abzuschließen:

'; Drop Table TableName; - -

[Beachten Sie, dass die Steuerzeichen in der Post-Ausgabe von StackOverflow weggelassen wurden, sodass Sie dem Codebeispiel folgen müssen, um Ihre Ausgabe zu erstellen]

Nachdem die PrepareString-Methode ausgeführt wurde, hat sie genau dieselbe Ausgabe - der Chr(8)-ASCII-Code ist die Rücktaste, die das zusätzliche "'" entfernt, das Sie an meine anhängen, wodurch Ihre Zeichenfolge geschlossen wird, und dann bin ich frei, am Ende hinzuzufügen, was ich will. Ihr PrepareString sieht mein nicht -- weil ich tatsächlich verwende - - mit einem Backspace-Zeichen, um das Leerzeichen zu entfernen.

Der resultierende SQL-Code, den Sie erstellen, führt dann meine Drop-Table-Anweisung ungehindert aus und ignoriert umgehend den Rest Ihrer Abfrage.

Das Lustige daran ist, dass Sie nicht druckbare Zeichen verwenden können, um im Grunde jede Zeichenprüfung zu umgehen, die Sie erfinden können. Daher ist es am sichersten, parametrisierte Abfragen zu verwenden (was Sie nicht gefragt haben, aber der beste Weg ist, dies zu vermeiden).