Quando se planeja o desenvolvimento de um site, uma preocupação que deve ser levado em conta é a segurança.
É comum vemos sites serem “hackeados” através de falhas no próprio site. Vamos escrever uma série de artigos falando das falhas mais comuns e do que podemos fazer para evitá-las.
No primeiro artigo iremos falar sobre um dos problemas mais comuns: SQL-INJECTION.
Funcionamento
Este ataque é feito inserindo dados através de formulário que, ao serem processados, interrompam a instrução sql original e executa outra, enviada pelo invasor. Geralmente é utilizado para conseguir logar na área administrativa de um determinado site sem que se tenha as credenciais necessárias.
Veja um exemplo de string que pode ser enviada através de formulários para tentar se autenticar:
Imagine um script asp autenticando um usuário da seguinte maneira:
Select * from ADM where login=’” & request.form(“login”) & “‘”
Agora imagine que o invasor digite, no campo login do formulário o seguinte:
hi’ or ‘a’='a
O resultado desta sql será:
Select * from ADM where login=’hi’ or ‘a’='a‘
Isto irá retornar verdadeiro, e o usuário logará no sistema sem saber o login.
Como evitar
Você deve filtrar os campos que vem do formulário, removendo os caracteres que permitem ao invasor interromper o seu comando SQL e executar o dele.
Basta tratar os dados que vem do formulário, removendo os caracteres:
(;) , (') e (--).
Esta remoção pode ser realizada com função replace do asp, ou equivalente em outras linguagens. Em php você pode utilizar a função mysql_real_escape_string.
Uma observação que deve ser levado em conta é que todo e qualquer dado de formulário deve ser filtrado, não apenas os campos referente a login e senha. Inclusive dados vindo de checkbox e radio buttons, pois o invasor pode gerar outro html modificando estes campos e utilizando-os para a invasão.
Outra observação importante é filtrar estes dados sempre do lado do servidor. Mesmo que você valide os dados em javascript, nada impede do invasor desabilitar o javascript da máquina, e assim enviar os dados para o servidor. A validação do lado do servidor é necessária.