In antwoord op uw directe vraag:Verhindert deze code SQL-injectie:Nee
Hier is het bewijs - duw deze string door de PrepareString-methode:
Dim input = "'" & Chr(8) & "; Drop Table TableName; - " & Chr(8) & "-"
Dim output = PrepareString(input)
Console.WriteLine(input)
Console.WriteLine(output)
Ik heb de GetRecord-methode die je hebt gepost gewijzigd om de volledig voorbereide SQL-string te retourneren in plaats van het record uit de database te halen:
Console.WriteLine(GetRecord(output))
En dit is de uitvoer
Input = ; Drop Table TableName; --
Output = '; Drop Table TableName; --
Query = SELECT * FROM TableName WHERE Key = ''; Drop Table TableName; --'
Voeg 1 extra regel code toe:
My.Computer.Clipboard.SetText(input)
En je hebt de string die je nodig hebt rechtstreeks naar je klembord gekopieerd om in je invoerveld op de website te plakken om je SQL-injectie te voltooien:
'; Drop Table TableName; - -
[Merk op dat de controletekens zijn weggelaten uit de post-uitvoer door StackOverflow, dus u moet het codevoorbeeld volgen om uw uitvoer te maken]
Nadat de methode PrepareString is uitgevoerd, zal deze exact dezelfde uitvoer hebben - de Chr(8) ASCII-code is de backspace die de extra "'" verwijdert die u aan de mijne toevoegt, waardoor uw string wordt gesloten en dan ben ik vrij om aan het einde toe te voegen wat ik wil. Uw PrepareString ziet mijn -- omdat ik eigenlijk gebruik -- niet met een backspace-teken om de spatie te verwijderen.
De resulterende SQL-code die u aan het bouwen bent, voert vervolgens mijn Drop Table-instructie ongehinderd uit en negeert de rest van uw query onmiddellijk.
Het leuke hiervan is dat je niet-afdrukbare tekens kunt gebruiken om in feite elke tekencontrole die je kunt bedenken te omzeilen. Het is dus het veiligst om geparameteriseerde zoekopdrachten te gebruiken (wat niet is wat u heeft gevraagd, maar dit is de beste manier om dit te vermijden).