Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Este código impede a injeção de SQL?


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