Segurança: SQL Injections
Postado por Abraão Levi Oliveira Figueredo em 15 de fevereiro de 2010
Ataques de SQL injections consistem na exploração de vulnerabilidades de um sistema, inserindo e executando códigos maliciosos num banco de dados.
Basicamente, esta falha acontece quando uma determinada variável não manipula de forma correta os valores que são inseridos dentro dela, passando esses dados diretamente para uma query SQL e executando logo em seguida.
Vejamos dois tipos de vulnerabilidades clássicas:
Caracteres de escape
Quando não tratamos os conteúdo de uma variável podemos obter resultados infelizes. Uma variável que não é filtrada para remoção de caracteres de escape, pode resultar em um poder de manipulação para os usuários maliciosos. Como assim? Segue o exemplo:
SQL = “SELECT * FROM usuarios WHERE nome =” + NomeUsuario + “;”
Este código tem a função de trazer todos os dados de um determinado usuário. Porém, se a variável “NomeUsuario” for modificado para um valor especifico que contenha caracteres de escape – exemplos: ‘, “, ) – Essa busca pode retornar mais que o previsto. Exemplo: se o conteúdo da variável for a String:
Levi’ or ‘teste’ = ’teste
Quando executado no banco de dados, teremos algo semelhante a isso:
SELECT * FROM usuarios WHERE nome = ‘Levi’ OR ‘teste’ = ‘teste’;
Em vez de trazer as informações de um determinado usuário, você terá em mãos o dados de todos usuários. Ou pior, se estivéssemos num processo de login? Imagine as consequências.
Falta de atenção com os dados
Imagine o cenário: Uma aplicação faz uma consulta SQL com uma variável numérica, do tipo inteiro, só que o programa não possui uma checagem dessa variável para saber se realmente ela é do tipo inteiro. Usando um exemplo semelhante ao anterior:
SQL = “SELECT * FROM usuarios WHERE id =” + idUsuario + “;”
Se a variável “idUsuario” não for tratada, ou ainda pior, for uma String, poderíamos colocar um valor qualquer nessa variável:
354; DROP TABLE usuarios
E a nossa query ficaria assim:
SELECT * FROM usuarios WHERE id = 354; DROP TABLE usuarios;
Como o ponto e vírgula (;) diz que o fim de comando, se tiver algo depois disso e um novo comando SQL.
Como se proteger?
Um dos modos é utilizar parâmetros nas querys SQL.
Hoje é muito comum se trabalhar com esse método de querys parametrizadas, dessa forma nos asseguramos que tipo de dado está sendo enviado e limitamos coisas como tipo e tamanho. Já temos alguns exemplos aqui em outras vídeo aulas com .NET e no Tutorias-city no caso do PHP, para o uso desses tipo de técnica.
Um exemplo simples em Java:
PreparedStatement Cmd = conn.prepareStatement(“SELECT * FROM usuarios WHERE user=? AND pass=? ”); Cmd.setString(1, username); Cmd.setString(2, password);
No caso de tratamento de escapes, podemos brincar um pouquinho com str_replace no PHP:
$filtro = array("\"","\\","/","*","'","=","-","#",";","<",">","+","%"); $nome = "Eu\ 'gosto/ d'e <**vegetai's verde=s; <\\pizza*!"; echo str_replace($filtro,'', $nome);
Conclusão
Existem diversas técnicas se proteger desses tipos de ataques, aqui foi demonstrado dois exemplos super simples, mas que vale a pena prestar atenção nesses detalhes.
Um projeto vulnerável a SQL injections está submetido a alguns (ou muitos) riscos, como: Alteração de arquivos ou de entradas no banco de dados (técnica conhecida como defacing), arquivos podem ser apagados, ou ainda está sujeito hospedar vírus, malwares e spywares. Além é claro, de estar exposto a situações mais sérias, como roubo de senhas e informações de cartões de crédito, dependendo do caso.
Existem muitas outras formas de se previnir contra ataques de SQL Injection, mas o mais importante é que nós devemos estar sempre buscando novos métodos, aumentando nosso conhecimento sobre segurança e aplicando nos projetos!
Então é isso e até a Próxima!
Artigo postado em: Artigos e tutoriais, Programação
Tags: banco de dados, mysql, seguranca, sql, sql injection, sql server

Comentários
Sem Comentários
Deixe um Comentário!