sql >> Database >  >> RDS >> Sqlserver

Voorkomt deze code SQL-injectie?

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).



  1. Controlebeperkingen in PostgreSQL begrijpen

  2. Hoe de datumtijd in Postgres in Unix-tijdperkwaarde te converteren?

  3. SQL Server-fout 206:clash van operandtype

  4. Wat geeft parameters door aan SQL en waarom heb ik deze nodig?