В отговор на директния ви въпрос:Този код предотвратява ли инжектирането на SQL:Не
Ето доказателството - прокарайте този низ през метода PrepareString:
Dim input = "'" & Chr(8) & "; Drop Table TableName; - " & Chr(8) & "-"
Dim output = PrepareString(input)
Console.WriteLine(input)
Console.WriteLine(output)
Промених метода GetRecord, който публикувахте, за да върна напълно подготвения SQL низ, вместо да получа записа от базата данни:
Console.WriteLine(GetRecord(output))
И това е изходът
Input = ; Drop Table TableName; --
Output = '; Drop Table TableName; --
Query = SELECT * FROM TableName WHERE Key = ''; Drop Table TableName; --'
Добавете 1 допълнителен ред код:
My.Computer.Clipboard.SetText(input)
И имате низа, от който се нуждаете, копиран направо в клипборда, за да го поставите в полето си за въвеждане на уебсайта, за да завършите SQL инжекцията:
'; Drop Table TableName; - -
[Отбелязвайки, че контролните знаци са били пропуснати от изхода на публикацията от StackOverflow, така че ще трябва да следвате примера с код, за да създадете своя изход]
След като методът PrepareString бъде стартиран, той ще има точно същия изход - Chr(8) ASCII кодът е backspace, който ще премахне допълнителното "'", което добавяте към моя, което ще затвори вашия низ и след това аз съм свободен да добавя каквото си поискам в края. Вашият PrepareString не вижда моя - защото всъщност използвам - - със знак за връщане, за да премахнете интервала.
Полученият SQL код, който изграждате, след това ще изпълни моя оператор Drop Table безпрепятствено и незабавно ще игнорира останалата част от вашата заявка.
Забавното в това е, че можете да използвате непечатаеми знаци, за да заобиколите всяка проверка на знаци, която можете да измислите. Така че е най-безопасно да използвате параметризирани заявки (което не е това, което поискахте, но е най-добрият начин да избегнете това).