Percebo que as consultas SQL parametrizadas são a maneira ideal de higienizar a entrada do usuário ao criar consultas que contenham entrada do usuário, mas estou me perguntando o que há de errado em receber entradas do usuário e escapar de aspas simples e cercar toda a cadeia de caracteres com aspas simples. Aqui está o código:
sSanitizedInput = "'" & Replace(sInput, "'", "''") & "'"
As aspas simples inseridas pelo usuário são substituídas por aspas duplas, o que elimina a capacidade do usuário de finalizar a sequência, para que qualquer outra coisa que eles digitem, como ponto-e-vírgula, sinais de porcentagem etc. fará parte da sequência e não é realmente executado como parte do comando.
Estamos usando o Microsoft SQL Server 2000, para o qual acredito que as aspas simples são o único delimitador de strings e a única maneira de escapar do delimitador de strings, portanto, não há como executar nada que o usuário digitar.
Não vejo nenhuma maneira de iniciar um ataque de injeção de SQL contra isso, mas percebo que, se fosse tão à prova de balas quanto me parece, alguém já teria pensado nisso e seria uma prática comum.
O que há de errado com este código? Existe uma maneira de obter um ataque de injeção de SQL além dessa técnica de higienização? Exemplo de entrada do usuário que explora essa técnica seria muito útil.
ATUALIZAR:
Ainda não conheço nenhuma maneira de iniciar efetivamente um ataque de injeção de SQL contra esse código. Algumas pessoas sugeriram que uma barra invertida escaparia de uma aspas simples e deixaria a outra finalizar a string para que o restante da string fosse executado como parte do comando SQL, e eu percebo que esse método funcionaria para injetar SQL no um banco de dados MySQL, mas no SQL Server 2000 a única maneira (que eu consegui encontrar) de escapar de uma aspas simples é com outra aspas simples; barras invertidas não o farão.
E, a menos que haja uma maneira de interromper o escape da aspas simples, nada do restante da entrada do usuário será executado porque tudo será considerado como uma sequência contígua.
Entendo que existem maneiras melhores de higienizar as entradas, mas estou realmente mais interessado em saber por que o método que forneci acima não funcionará. Se alguém souber de alguma maneira específica de montar um ataque de injeção SQL contra esse método de higienização, eu adoraria vê-lo.