A intenção da injeção de MySQL é assumir o controle do banco de dados do site e roubar informações. Bancos de dados comuns de código aberto, como MySQL, têm sido usados por muitos desenvolvedores de sites para armazenar informações importantes, como senhas, informações pessoais e informações administrativas.
MySQL é popular porque é usado com a linguagem de script do lado do servidor mais popular, PHP. Além disso, PHP é a linguagem principal do servidor Linux-Apache que domina a Internet. Portanto, isso significa que os hackers podem explorar facilmente o PHP, assim como o spyware do Windows.
Os hackers inserem grandes quantidades de código malicioso em um formulário da Web inseguro (por meio de menus suspensos, caixas de pesquisa, formulários de contato, formulários de consulta e caixas de seleção).
O código malicioso será enviado para o banco de dados MySQL e depois “injetado”. Para visualizar esse processo, primeiro considere a seguinte instrução de consulta SELECT básica do MySQL:
SELECT * FROM xmen WHERE nome de usuário = 'wolverine'
Esta consulta solicitará ao banco de dados com a tabela "xmen" que retorne um determinado dado com o nome de usuário "wolverine" no MySQL.
No formulário web, o usuário irá inserir wolverine, e esses dados serão passados para a consulta MySQL.
Se a entrada for inválida, existem outras maneiras de os hackers assumirem o controle do banco de dados, como definir o nome de usuário:
' OR ''=''
Você pode pensar que é seguro usar a sintaxe normal do PHP e do MySQL para realizar a entrada, porque toda vez que alguém inserir um código malicioso, você receberá uma mensagem de “consulta inválida”, mas esse não é o caso. Os hackers são espertos e qualquer falha de segurança não é fácil de corrigir porque envolve limpeza de banco de dados e redefinição de privilégios administrativos.
Dois mal-entendidos comuns sobre ataques de injeção de MySQL são os seguintes:
1. Os administradores de rede acreditam que injeções maliciosas podem ser limpas com software antivírus ou anti-spyware. O fato é que esse tipo de infecção explora pontos fracos do banco de dados MySQL. Ele não pode ser simplesmente removido por qualquer programa anti-spyware ou antivírus.
2. A injeção do MySQL ocorre devido à cópia de um arquivo infectado de outro servidor ou fonte externa. Este não é o caso. Esse tipo de infecção ocorre quando alguém insere um código malicioso em um formulário desprotegido de um site e depois acessa o banco de dados. A injeção de MySQL pode ser limpa removendo o script malicioso, em vez de usar um programa antivírus.
O processo de validação de entrada do usuário
faz backup de um banco de dados limpo e o coloca fora do servidor. Exporte um conjunto de tabelas MySQL e salve-as na área de trabalho.
Em seguida, vá para o servidor e primeiro desligue temporariamente a entrada do formulário. Isso significa que o formulário não pode processar os dados e o site é encerrado.
Em seguida, inicie o processo de limpeza. Primeiro, em seu servidor, limpe quaisquer injeções de MySQL restantes. Altere todas as senhas de banco de dados, FTP e sites.
Na pior das hipóteses, se você atrasar a limpeza, poderá verificar novamente se há programas ocultos em execução no seu servidor. Esses programas ocultos são cavalos de Tróia instalados por hackers. Remova-o completamente e altere todas as permissões de FTP. Faça uma varredura no servidor em busca de todos os cavalos de Tróia e malware.
Ao modificar o programa de script PHP, os dados do formulário serão processados. Uma boa maneira de evitar a injeção do MySQL é nem mesmo confiar nos dados do usuário. A validação da entrada do usuário é muito importante para evitar injeção de MySQL.
Para projetar um filtro para filtrar a entrada do usuário, aqui estão algumas dicas:
1. A entrada do formulário são números. Você pode verificar se é um número testando se é igual ou maior que 0,001 (assumindo que você não aceita zero).
2. Se for um endereço de e-mail. Verifique se consiste em combinações de caracteres permitidas, como "@", AZ, az ou alguns números.
3. Se for o nome de uma pessoa ou nome de usuário. Pode ser verificado se contém caracteres ilegais, como e e *, que são caracteres maliciosos que podem ser usados para injeção de SQL.
Validando a entrada numérica
O script a seguir verifica se um número válido de 0,001 ao infinito foi inserido. Vale ressaltar que em um programa PHP você pode até permitir o uso de números dentro de um determinado intervalo. Use este script de validação para garantir que apenas um número seja inserido no formulário.
Suponha que você tenha três variáveis numéricas em seu programa e precise validá-las, vamos nomeá-las num1, num2 e num3:
//Validar entrada numérica
;
if($_POST['num1'] >= 0,001 && $_POST['num2'] >= 0,001 && $_POST['num3'] >= 0,001){
}else{
}
?>
E a condição pode ser estendida para acomodar mais de três números. Portanto, se você tiver 10, precisará apenas expandir a instrução AND.
Isto pode ser usado para validar um formulário que aceita apenas números, como quantidades de contrato, números de licença, números de telefone, etc.
Validar entradas de texto e endereços de e-mail
O seguinte pode ser usado para validar entradas de formulário, como nomes de usuário, nomes e endereços de e-mail:
//Validar entrada de texto
if (! preg_match('/^[-az.-@,'s]*$/i',$_POST['nome'])){
}
elseif ($empty==0){
}else{
}
?>
Uma vantagem deste script de validação é que ele não aceita entradas em branco. Alguns usuários mal-intencionados também manipulam bancos de dados por meio de entradas em branco. Usando o script acima, valide apenas uma variável literal, "$name". Isso significa que se você tiver três variáveis de texto, poderá configurar um script de validação para cada variável para garantir que cada variável passe na revisão antes de entrar no banco de dados.