В ответ на ваш прямой вопрос: предотвращает ли этот код 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 - это обратная область, которая удалит лишний «», который вы добавляете к моему, который закроет вашу строку, а затем Я свободен, чтобы добавить все, что я хочу в конце. Ваша PrepareString не видит моего - потому что я на самом деле использую - символа возврата, чтобы удалить пробел.
Полученный в результате SQL-код будет беспрепятственно выполнять мой оператор Drop Table и быстро игнорировать остальную часть вашего запроса.
Самое интересное в том, что вы можете использовать непечатаемые символы, чтобы обойти любую проверку символов, которую вы можете придумать. Поэтому безопаснее использовать параметризованные запросы (это не то, что вы просили, но лучший способ избежать этого).