O que é SQL injection?
É conhecido pelo método utilizado para inserir, apagar, editar, entre várias outras funções SQL em ataques a banco de dados através de formulários do tipo texto e password, onde o atacante poderá inserir um usuário em sua tabela do banco de dados, dando-o permissão para acessar todo o sistema ou por exemplo, dar um delete em toda sua tabela e apagar todos os dados contidos nela .
Como evitar?
O PHP hoje conta com uma rica biblioteca onde encontramos alguns métodos para nos auxiliar nessa operação.
Iremos utilizar:
- preg_replace() - Substitui uma determinada string por outra;
- sql_regcase() - Embora pouco utilizada e conhecida, esta função pega todos os caracteres da nossa string e passa para maiúscula e minúscula, assim não tem como diferenciar SELECT de select, ele vai detectar mesmo assim;
- trim() - O trim() limpa espaços vazios da string;
- strip_tags() - Remove tag html da nossa string;
- addslashes() - Adiciona barras invertidas à variável.
Você poderá encontrar mais sobre estes e mais métodos ou funções ("programação estruturada") no próprio site do PHP:
Vamos realmente ao que nos interessa, iremos criar nossa function para fazer esse trabalho.
function removerSql($Variavel) { //Iniciamos nossa function passando uma variável de parâmetro
// Remove o código SQL inserido no ataque e troca por espaços em branco
$Variavel = preg_replace(sql_regcase("/(from|select|insert|name|like|delete|where|drop table|show tables|#|*|--|\\\\)/"),"",$Variavel);
// Limpa os espaços vazios
$Variavel = trim($Variavel);
// Remove tags html que também podem danificar o layout do site
$Variavel = strip_tags($Variavel);
// Adiciona barras invertidas a uma string
$Variavel = addslashes($Variavel);
// Retorna o resultado da nossa function
return$Variavel;
}
Iremos observar que em nosso resultado final só aparecerá teste de SQL injection onde as palavras adicionadas em preg_replace serão todas removidas.
echo ant_sql("Select teste de sql injection");
Código pronto para o uso:
function ant_sql($Variavel) {
$sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|*|--|\\\\)/"),"",$Variavel);
$sql = trim($Variavel);
$sql = strip_tags($Variavel);
$sql = addslashes($Variavel);
return $Variavel;
}
echo ant_sql("Select teste de sql injection");
Espero ter ajudado a todos que encontram dificuldades para remover código inseridos em um simples formulário de login.