Em resposta à sua pergunta direta:Este código impede a injeção de SQL:Não
Aqui está a prova - envie esta string através do método PrepareString:
Dim input = "'" & Chr(8) & "; Drop Table TableName; - " & Chr(8) & "-"
Dim output = PrepareString(input)
Console.WriteLine(input)
Console.WriteLine(output)
Modifiquei o método GetRecord que você postou para retornar a string SQL totalmente preparada em vez de obter o registro do banco de dados:
Console.WriteLine(GetRecord(output))
E esta é a saída
Input = ; Drop Table TableName; --
Output = '; Drop Table TableName; --
Query = SELECT * FROM TableName WHERE Key = ''; Drop Table TableName; --'
Adicione 1 linha extra de código:
My.Computer.Clipboard.SetText(input)
E você tem a string necessária copiada diretamente para sua área de transferência para colar em seu campo de entrada no site para concluir sua injeção de SQL:
'; Drop Table TableName; - -
[Observando que os caracteres de controle foram omitidos da saída do post pelo StackOverflow, então você terá que seguir o exemplo de código para criar sua saída]
Depois que o método PrepareString for executado, ele terá exatamente a mesma saída - o código ASCII Chr(8) é o backspace que removerá o "'" extra que você está anexando ao meu, que fechará sua string e então eu estou livre para adicionar o que eu quiser no final. Seu PrepareString não vê meu -- porque na verdade estou usando -- com um caractere de retrocesso para remover o espaço.
O código SQL resultante que você está construindo executará minha instrução Drop Table sem impedimentos e ignorará prontamente o restante de sua consulta.
A coisa divertida sobre isso é que você pode usar caracteres não imprimíveis para basicamente ignorar qualquer verificação de caracteres que você possa inventar. Portanto, é mais seguro usar consultas parametrizadas (que não é o que você pediu, mas é o melhor caminho para evitar isso).