Som svar på din direkta fråga:Förhindrar denna kod SQL-injektion:Nej
Här är beviset - tryck den här strängen genom PrepareString-metoden:
Dim input = "'" & Chr(8) & "; Drop Table TableName; - " & Chr(8) & "-"
Dim output = PrepareString(input)
Console.WriteLine(input)
Console.WriteLine(output)
Jag modifierade GetRecord-metoden du postade för att returnera den fullt förberedda SQL-strängen istället för att hämta posten från databasen:
Console.WriteLine(GetRecord(output))
Och detta är resultatet
Input = ; Drop Table TableName; --
Output = '; Drop Table TableName; --
Query = SELECT * FROM TableName WHERE Key = ''; Drop Table TableName; --'
Lägg till 1 extra kodrad:
My.Computer.Clipboard.SetText(input)
Och du har strängen du behöver kopiera direkt till ditt urklipp för att klistra in i ditt inmatningsfält på webbplatsen för att slutföra din SQL-injektion:
'; Drop Table TableName; - -
[Notera att kontrolltecken har utelämnats från postutdata av StackOverflow, så du måste följa kodexemplet för att skapa din utdata]
Efter att PrepareString-metoden har körts kommer den att ha exakt samma utdata - Chr(8) ASCII-koden är backsteg som tar bort det extra "'" som du lägger till min som kommer att stänga din sträng och sedan är jag fri att lägga till vad jag vill på slutet. Din PrepareString ser inte min -- eftersom jag faktiskt använder -- med ett backstegstecken för att ta bort blanksteg.
Den resulterande SQL-koden som du bygger kommer sedan att köra min Drop Table-sats obehindrat och omedelbart ignorera resten av din fråga.
Det roliga med det här är att du kan använda icke-utskrivbara tecken för att i princip kringgå alla teckenkontroller du kan hitta på. Så det är säkrast att använda parametriserade frågor (vilket inte är vad du frågade, men är den bästa vägen för att undvika detta).