+3

Prevenindo SQL Injection

criado por Péricles Luz em 07/01/2011 12:42pm
Depois de ter escrito sobre o ataque em http://dascoisasqueaprendi.com.br/tiseguranca/sql-injection-outro-foco/, vou falar sobre algumas maneiras de se prevenir. Apesar do foco ser aplicações em PHP, as dicas servem para outras linguagens. Aliás, é sempre bom ter em mente que, por se tratar de um ataque direcionado à linguagem SQL, toda aplicação que a utilize para consultas no banco de dados deve ser protegida. Cientes disso, seguem as dicas:

Habilitar "magic quotes" no PHP: apesar de ser uma ótima ação na prevenção contra SQL Injection, pode ter efeitos colaterais desagradáveis. Habilitar essa propriedade no PHP torna sua aplicação mais lenta. Além disso, já é uma função considerada obsoleta na versão 5.3 do PHP e deve ser descontinuada nas próximas versões. Portanto, não seria aconselhável confiar sua proteção em algo que não durará muito tempo.

Usar a função addslashes(): essa função tem o mesmo efeito que habilitar magic_quotes com a vantagem de ser aplicada apenas onde for conveniente. Na prática, ela põe o caracter de escape antes de aspas simples ou duplas, antes da barra invertida e antes do cacater NULL. Lembrando que, para retornar ao texto original, é necessário usar a função stripslashes().

Fazer uma validação na entrada: é extremamente importante que, antes de qualquer outra manipulação nos dados, seja feita uma validação para certificar que estão num padrão aceitável. Por exemplo, verificar se campos numéricos têm apenas números, se as datas estão num formato adequado, se o login do usuário tem apenas letras e números etc.

Usar prepared statements ao invés do código SQL diretamente: as duas dicas acima já são extremamente eficazes na prevenção de SQL Injection. Entretanto, além de uma proteção adicional, usar prepared statements pode também lhe trazer um incremento na performance de suas consultas ao banco de dados.

Limitar os privilégios das contas com acesso ao banco de dados: é muito importante, em qualquer aplicação, que as contas de acesso ao banco de dados tenham apenas os privilégios necessários à execução de suas funções. Muitas vezes, somos tentados a definir o nível de acesso da conta usando comandos como:
GRANT ALL ON banco.* TO 'fulano'@'localhost' IDENTIFIED BY 'password123'
para não termos "problemas de acesso". Na verdade, acabamos tendo problemas bem maiores porque criamos um super usuário com poderes suficientes para nos causar muitos danos. Entre outros, o privilégio FILE, que permite o ataque citado no post anterior.

Comentários:

Mostrando 1 - 10 de 12 comentários
roxy disse:
Se quiser, podemos até excluir tabelas dessa forma. Dito isso, podemos concluir que nossa instrução SQL não foi feita da melhor forma, já que está vulnerável a ataques...http://assistiranimesonline.net
18/01/2012 12:24pm (~1 mês atrás)

roxy disse:
http://r7filmes.com
Tenho usado bastate esta sintexe!
11/01/2012 10:59am (~1 mês atrás)

roxy disse:
Roberto, muito boa suas instruçoes!
http://www.viagensempromocao.com.br
07/01/2012 11:19am (~1 mês atrás)

Roberto disse:
Eu geralmente faço dessa maneira:

$Login = preg_replace("/[<>'\"]/","",$_POST['login']);

Acharam boa?
07/01/2012 11:00am (~1 mês atrás)

roxy disse:
Muito obrigado pela explicação, sem duvidas estava fazendo algo errado, mas você me salvou como sempre.
http://www.viagensempromocao.com.br
07/01/2012 10:31am (~1 mês atrás)

lilo matt disse:
Esse é um metodo adequado para evitar burlações no banco de dados http://www.pousadasurucua.com.br
26/12/2011 8:43pm (~1 mês atrás)

mathias disse:
Aconselho a pessoa a usar o PDO, alem de ter prepared statements essa função tambem conecta em qualquer banco de dados? Está função não está tão bem. http://www.linkkei.com
05/11/2011 4:13pm (~3 meses atrás)

kelly sales disse:
Eu corro perigo se eu der total privilegio para mim mesmo na criação do banco de dados? Mais uma pergunta: tem possibilidade de alguem invadir meu banco de dados apenas invadindo meus arquivos de host? <a href="http://www.linkkei.com">Linkkei</a>
29/10/2011 3:00pm (~3 meses atrás)

Bem interessante, realmente essas dicas servem bem pra outros tipos de linguagem. Se não me engano o Fórum de java, http://javafree.uol.com.br, já havia abordado algo sobre isso.

Parabéns, excelente post
13/10/2011 1:09pm (~4 meses atrás)

Bem interessante, realmente essas dicas servem bem pra outros tipos de linguagem. Se não me engano o <a href="http://javafree.uol.com.br">Fórum de java, javafree</a> já havia abordado algo sobre isso.

Parabéns, excelente post
13/10/2011 1:08pm (~4 meses atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)