sql >> Database teknologi >  >> RDS >> Sqlserver

Forhindrer denne kode SQL-injektion?

Som svar på dit direkte spørgsmål:Forhindrer denne kode SQL-injektion:Nej

Her er beviset - skub denne streng gennem PrepareString-metoden:

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

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

Jeg ændrede den GetRecord-metode, du postede, for at returnere den fuldt forberedte SQL-streng i stedet for at hente posten fra databasen:

Console.WriteLine(GetRecord(output))
 

Og dette er output

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

Tilføj 1 ekstra linje kode:

My.Computer.Clipboard.SetText(input)
 

Og du har den streng, du skal kopiere direkte til dit udklipsholder for at indsætte i dit inputfelt på webstedet for at fuldføre din SQL-injektion:

'; Drop Table TableName; - -

[Bemærk at kontroltegnene er blevet udeladt fra post-outputtet af StackOverflow, så du bliver nødt til at følge kodeeksemplet for at oprette dit output]

Efter at PrepareString-metoden er kørt, vil den have nøjagtig samme output - Chr(8) ASCII-koden er backspace, som vil fjerne det ekstra "'", som du tilføjer til min, hvilket vil lukke din streng, og så er jeg fri til at tilføje, hvad jeg vil til sidst. Din PrepareString kan ikke se min -- fordi jeg faktisk bruger -- med et backspace-tegn for at fjerne mellemrummet.

Den resulterende SQL-kode, som du bygger, vil derefter udføre min Drop Table-sætning uhindret og straks ignorere resten af ​​din forespørgsel.

Det sjove ved dette er, at du kan bruge ikke-udskrivbare tegn til stort set at omgå enhver tegnkontrol, du kan opfinde. Så det er sikrest at bruge parametriserede forespørgsler (hvilket ikke er det, du spurgte om, men er den bedste vej til at undgå dette).



  1. Heroku psql:FATAL:resterende forbindelsespladser er reserveret til ikke-replikering af superbrugerforbindelser

  2. Det svarer til SQLServer-funktionen SCOPE_IDENTITY() i mySQL?

  3. Sådan gendannes en SQL Server-database på en Mac ved hjælp af Azure Data Studio

  4. Datareplikering i IRI Workbench