+5

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 13 comentários
Adam disse:
This is exactly what I was looking for. Thanks for sharing this great article! That is very interesting and informative about SQL Injection prevention.
http://garageflooringuk.co.uk/garage-flooring.html
28/11/2014 12:15am (~2 anos atrás)

Adam disse:
Fantastic article, this is so well explained that all my Collage friends could follow it, thanks and keep up the great work.
http://www.horserubbermats.co.uk/Rubber-Matting/Horse-Mats
28/11/2014 12:14am (~2 anos atrás)

Adam disse:
I wanted to thank you for this websites. I would like to thank for the efforts you have made in writing this post. I am hoping the same best work from you in the future as well. http://gymnasticmatsco.co.uk
28/11/2014 12:06am (~2 anos atrás)

Adam disse:
I am also facing this problem In my DB. I browsed you website and I found it best for new db developer. http://groundreinforcementmesh.co.uk
28/11/2014 12:03am (~2 anos atrás)

Olá, Meu site http://www.filmesonline4.com.br está passando por sql injection e criei um plugin que bloqueia todos os metodos de hackiar se quiserem entre no site e pedem.
01/08/2014 12:19pm (~2 anos atrás)

AndersonSilva disse:
Exitem Várias maneiras de previnirem sql injection por exemplo usar um function convertendo o hack, se quizem saber mais acesse o site http://www.baixafree.com.br Obrigado!!!
20/01/2013 4:45am (~3 anos atrás)

Jefferson disse:
Muito bom o artigo!

É importante lembrar sempre destas e de outras dicas sobre a proteção contra SQL injection. Ainda existem muitos sites que não se protegem dessa ameaça.
26/07/2012 3:54pm (~4 anos atrás)

Fernando disse:
Parabéns pelo artigo Péricles. Ele está sendo muito útil para mim, uma vez que estou engatinhando no php e fui uma vítima recente deste tipo de ataque. Mas estou com uma dúvida. Usando prepared Statements, como posso obter a sql já com os parametros definidos? Preciso dela para salvar em log a ação que foi executada. Alguém ai sabe me ajudar?
27/06/2012 11:15am (~4 anos atrás)

Pois é vale lembrar tambem que se o servidor de hospedagem tiver proteção o seu site nunca sera hackeado por sql injection.
27/06/2012 10:01am (~4 anos atrás)

Jefrey disse:
Bom lembrar que escapar aspas nem sempre funciona. É totalmente possível fazer uma injeção sem usar aspas, convertendo algumas strings para hexadecimal. Também não é bom, como muitos gostam, filtrar algumas palavras da string.
06/06/2012 9:53pm (~4 anos atrás)

Novo Comentário:

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