Mais Populares

28 de dezembro de 2012

Protegendo consultas de SQL Inject no ASP Classic


Ao salvar um formulário, geralmente pegamos o valor e passamos diretamente para uma parte de uma string de query SQL e rodamos no banco, certo? Errado!

Antes de levar estes dados ao banco, devemos tratar os mesmos para que dados errados não estejam no meio de dados realmente e devera importantes.

Portanto, vou esclarecer como de uma maneira básica você pode proteger seu sistema e seu banco de dados de uma tática conhecida de SQL Inject, que é em suma a quebra desta string para rodar outro código de query SQL nativo no banco, recuperando informações que outrora não deveria ser recuperada.



Quebra de SQL


Cada tipo de banco de dados possui sua peculiaridade, no caso deste exemplo, iremos ver formas de proteger os formulários para banco de dados SQL Server, e posteriormente MySQL, que são os dois bancos de dados que estão em mais foco no momento (na web).

Antes de proteger o formulário, precisamos saber como funciona a query e como é possível rodar vários parâmetros em uma só solicitação.
SELECT codigo, usuario, senha FROM usuarios WHERE usuario = 'rodrigo' and senha = 'pula123';
Repare no código acima, isto é uma simples consulta ao banco para checar se existe determinado usuário ou não, passando por assim dizer.

Agora a mesma query, em vermelho o código que foi introduzido por um usuário.

SELECT codigo, usuario, senha FROM usuarios WHERE usuario = 'rodrig' or 1 = 1 or 1 = 'o' and senha = 'pula123';
Neste caso, como 1 e 1 é verdadeiro, irá retornar todos os usuários que existem no banco, e o usuário teria acesso concedido sem maiores problemas.

Estes problemas parecem simples, porém afetam até sites que "sabem" lidar com este tipo de conteúdo.

Este é um script de teste encontrado no tutorial da w3schools que não é protegido, e que conseguimos com sucesso realizar o SQL Inject. Claro, que isto é uma página de exemplo e não tem caráter destrutivo, e já alertamos os mesmos sobre o incidente.





A URL digitada com o código para exibir tudo é:

http://www.w3schools.com/asp/getcustomer.asp?q=NO' or '' = '

Caractere de escape para evitar SQL Inject

Todo caractere aspas simples, no SQL Server deve entrar como duas aspas simples para que o mesmo seja reconhecido como parte do conteúdo do campo, ou seja:

SELECT codigo, usuario, senha FROM usuarios WHERE usuario = 'rodrig'' or 1 = 1 or 1 = ''o' and senha = 'pula123';
Neste caso, o banco de dados saberá que está a procurar pelo campo contendo: "rodrigo ' or 1 = 1 or 1 = 'o", não interpretando o código no meio desta.

No ASP Classic, utilize a função replace no Request.Form ou Request.Querystring desta forma:

campo = Replace(Request.Form("campo"),"'","''")

Faça isto com todos os campos antes de passar para a query de SQL.

No MySQL, há uma outra variação que é o caractere de escape usado no javascript, o "\". 

Em um campo que será preparado para uma query MySQL, poderíamos então utilizar:

campo = Replace(Request.Form("campo"),"'","\'")

Faça isto com todos os campos antes de passar para a query de SQL. 

Dica: Se você faz upload de arquivos no servidor, nomes de arquivos podem ter aspas simples no nome, e podem quebrar a string SQL da mesma forma, então também salve sua query trocando as aspas simples pelas aspas duplas.

Considerações Finais

Utilize sempre com bom senso as ferramentas de banco de dados que você utilize, veja quais são os caracteres de escape específicos para sua base de dados e proteja seus formulários de ataques indesejados que podem acontecer do dia para a noite, e que podem dar muita dor de cabeça.

Obs.: No ASP.NET há métodos que cuidam de formulários que automatizam esta segurança, mas o intuito desde tutorial é explicar o básico, porque é nisto que muitos erram.

Um comentário :

  1. Obrigado me ajudou a diminuir as invasões constantes de Spammers

    ResponderExcluir

Deixe seu comentário abaixo e curta Tutorial TI no facebook!