Como nos proteger do SQL Injection?

1 Comentário

Hoje vou falar um pouco sobre como funciona o SQL Injection e como podemos proceder para que nós não sejamos pegos por este tipo de vulnerabilidade.

O que é SQL Injection?

SQL Injection é uma técnica de injeção de código que explora uma vulnerabilidade de segurança localizada na camada de banco de dados (database layer) do site. Na prática é utilizada por hackers (ou não) para ter acesso ao banco de dados do site da vítima sem que ele precise de um login ou uma senha efetivamente para fazê-lo.

Como funciona o SQL Injection?

Para entendermos melhor como funcionam os ataques via injeção de códigos SQL (SQL Injection), vou utilizar um caso bem comum entre os programadores para que vocês se familiarizem com mais facilidade.

Pense em um formulário para login no sistema e uma consulta na base de dados para verificar se determinado usuário e senha existe em na base de dados.
 

Exemplo
SELECT usuario,senha FROM usuarios WHERE usuario = ‘igorescobar’ AND senha=’123456′

O ataque acontece justamente no ponto, aonde o usuário preenche o usuário e a senha no formulário de login do site. Se você não filtra todos os dados que vem de FORA para DENTRO da sua aplicação, você corre o risco de ser atacado.

Na prática o código fica algo parecido com isso:

SELECT usuario,senha FROM usuarios WHERE usuario = ‘$usuario’ AND senha=’$senha’;

Estas variáveis ($usuario e $senha) estão vindo do $_POST do seu formulário e o servidor iria interpretar assim:

SELECT usuario,senha FROM usuarios WHERE usuario = ‘igorescobar’ AND senha=’123456′;

Agora imagine que eu sou um usuário mal intencionado e desejo logar no servidor de vocês sem ser autorizado.

No campo senha vou inserir o seguinte conteúdo:

123456′ OR ‘a’=’a

Vamos ver como fica?

SELECT usuario,senha FROM usuarios WHERE usuario = ‘igorescobar’ AND senha=’123456′ OR ‘a’=’a’;

Quer outro exemplo? …

Agora no campo senha eu vou inserir o seguinte conteúdo:
123456′; DROP TABLE usuarios; —

Vamos ver como fica?
SELECT usuario,senha FROM usuarios WHERE usuario = ‘igorescobar’ AND senha=’123456′; DROP TABLE usuarios; –‘;

Ok, agora você já esta pronto para passar no RH

O como eu me protejo dos ataques SQL Injection ?

Primeiro: Separe sempre a exibição de erros em 2 ambientes, o ambiente de desenvolvimento e o ambiente de produção. O ambiente de desenvolvimento pode ter qualquer tipo de erro emitido na tela, afinal, você precisa ver os erros para tratá-los, no ambiente de produção omita qualquer tipo de erro, qualquer erro pode ser uma pista para o hacker descobrir detalhes sobre o seu ambiente.

  

Segundo: Filtre todo o tipo de variável dados que vem de urls ou inputs de formulário $_GET ou $_POST para que nenhum dos dados imputados pelo usuário possa ser interpretado como parte da instrução SQL.

Vale lembrar que o certo seria utilizarmos PDO que já tem uma proteção definitiva contra isso, pois ele tem o acesso ao modelo do seu banco de dados e pode fazer muito melhor do que uma simples filtrarem genérica nos campos, ele pode filtrar cada campo dependendo do tipo de cada campo o que é muito melhor.

Caso você não use PDO, você pode utilizar também uma função chamada mysql_real_escape_string que também cumpre o que promete.

Solução definitiva para o SQL Injection

Está solução é válida apenas para as pessoas que não utiliza nenhuma das 2 (duas) soluções citadas acima.

Sobre o blog

Este Blog tem o objetivo de divulgar as novidades da WebinHost e compartilhar notícias sobre hosting, servidores, empreendedorismo e todo universo tecnológico.

Arquivos

Comente via Facebook
1 Comentário
  1. Responder

    Se proteger desse tipo de ataque é a melhor coisa que um programador em php pode fazer. Principalmente se utilizar variaveis no get da página como por exemplo $pg = $_GET[“pg”];

    Um jeito de evitar é colocar o int. $pg = (int)$_GET[“pg”]; assim ele só irá pegar os numeros até encontrar um caractere. Uma das maneiras de impedir ataques por paginador! =D

 

Deixe uma resposta