Prevenindo SQL Injection
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:
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.
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'
Páginas:
1
2
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
(~4 meses atrás)
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.
É 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
(~10 meses atrás)
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
(~11 meses 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
(~11 meses atrás)
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
(~11 meses atrás)
Eu geralmente faço dessa maneira:
$Login = preg_replace("/[<>'\"]/","",$_POST['login']);
Acharam boa?
$Login = preg_replace("/[<>'\"]/","",$_POST['login']);
Acharam boa?
07/01/2012 11:00am
(~1 ano atrás)
Usando tambem o real_escape ($conexao->real_escape_string($query)) também ajuda bastante.
15/08/2011 1:57pm
(~1 ano atrás)
Otimo artigo amigo, parabens.
Aconselho a pessoa a usar o PDO, alem de ter prepared statements essa função tambem conecta em qualquer banco de dados.
Um abraço.
Aconselho a pessoa a usar o PDO, alem de ter prepared statements essa função tambem conecta em qualquer banco de dados.
Um abraço.
16/02/2011 7:42pm
(~2 anos atrás)



disse:
disse: