Pular para o conteúdo

Injeção de SQL

Ao desenvolvermos uma página web com acesso ao banco de dados (BD) utilizamos queries SQL que fazem consultas a BD através de SGBDs como MySQL, Postgree etc. Estas consultas muitas das vezes não são confiáveis, podem ser manipuladas e passar por controles de acesso, podendo até ter acesso ao shell do servidor.
Mario Monteiro mtutucv
Hits: 24.096 Categoria: Banco de Dados Subcategoria: Avançado
  • Indicar
  • Impressora
  • Denunciar

Parte 2: Como evitar ataques

O exemplo que acabamos de ver mostra que o utilizador que quer atacar o sistema não precisa conhecer a estrutura do seu BD (o nome dos campos da tabela). Na maioria das vezes, para efetuar os ataques, eles tem que conhecer a estrutura do seu BD, mas imagine que o seu sistema é um pacote código aberto disponível na internet, que utiliza acesso a BD, o que acontece é que estes sistemas como são códigos abertos e de domínio público, muito facilmente os utilizadores mal intencionados tem um acesso a estrutura do BD, estudam as suas falhas, verificam as vulnerabilidades, e facilmente criam códigos SQL que permitem atacar o sistema.

Por isso quando implementar um sistema que é código aberto, não confie em nenhuma entrada que vem do cliente para o sistema com acesso a BD, praticamente nada, nem campos ocultos (hidden), pois estes podem ser conhecidos pelo utilizador e serem enviados pelo explorador.

As seguintes ações ajudam a prevenir contra os ataques, mas tente fazer sempre mais alguma coisa para impedir os ataques:
  • Sempre utilize usuários com poucos privilégios para entrar no sistema, haja como um utilizador de Linux no seu sistema e não como o do Windows.
  • Utilize funções para validar as entradas que o sistema espera, se for texto, número ou dígitos, no PHP existem várias funções de validação, por exemplo is_numeric(), ctype_digit(), pode até mudar o tipo com settype() sem o usuário perceber.
  • Utilize as funções mysql_escape_string() e sql_escape_string() para adicionar aspas para cada valor que não numérico. Se um mecanismo de escape de caracter específico para o seu BD não for disponível, as funções addslashes() e str_replace() podem ser utilizadas.
  • Não apresente mensagens de erros que possuam informação sobre o BD.

É importante também utilizar funções específicas de SGBD para o tratamento de queries enviados, o que diminui a compatibilidade do código fonte para operação com outros sistemas de banco de dados.

Importante também é evitar que seja mostrada mensagem de erro em um servidor Web, pelo fato de que estes apresentam nas mensagens de erros ou avisos caminhos de pastas do sistema de arquivos e informações a respeito do BD, podendo comprometer a segurança do sistema.

Para evitar que sejam mostradas mensagens de erros e avisos do PHP, é necessário a configuração da diretiva display_errors para Off no ficheiro de configurações do PHP (php.ini).

É da responsabilidade do desenvolvedor estar atento às possíveis falhas de segurança existentes nos script que produz, principalmente quando está a desenvolver sistemas de informação, onde a informação é algo de valioso. Este é um ramo muito sensível para qualquer desenvolvedor, tem de estar atento a isso, porque só a funcionalidade do sistema não basta, o que importa é a garantia da estabilidade do sistema, mantendo os dados legíveis e fidedignos a terceiros.

   1. Ataques
   2. Como evitar ataques

Listar dados em MySQL utilizando PHP e AJAX (parte 1)

MongoDB Aggregation

Informix: Instalação - Configuração - Conceito

Gerencie suas informações através de instruções SQL com selects turbinados (para leigos e experts)

Instalando o poderoso banco de dados IBM DB2!

Implementação LDAP e Java

#1 Comentário enviado por skywishrfz em 08/07/2008 - 10:29h
Legal o artigo!

Se não tiver acesso ao php.ini, pode também usar a função

error_reporting(null) pra nao exibir as mensagens de erro!

outra dica é hashar a senha antes de enviar o sql tipo

com md5(), sha1(), ou mesmo o crypt();

flw!!
#3 Comentário enviado por aprendiz_ce em 08/07/2008 - 13:21h
Apesar de resumido... é nota 10!!! Vale pelo alerta.

Parabéns pelo artigo!

#4 Comentário enviado por guinter em 08/07/2008 - 17:20h
Ficou bom o artigo apesar de estar bem básico. Abraços!
#5 Comentário enviado por ruhanbidart em 08/07/2008 - 22:07h
Resumido, simples e básico mas bem legal! Parabéns.
#6 Comentário enviado por mtavares em 15/07/2008 - 18:39h
Realmente é básico, pois há muitas outras técnicas e especificidades. Para já um tema interessante visto que muitos de nós que programamos ou não temos conhecimento acerca ou não preocupamos até alguém invadir e aí é feio. Parabéns pelo artigo.
Vou esperar pela "2ª parte".
#7 Comentário enviado por carlosdias98 em 07/09/2008 - 01:20h
ótimo artigo
#8 Comentário enviado por Dieh em 03/11/2011 - 10:47h
Artigo simples, prático e bom.

Contribuir com comentário

Entre na sua conta para comentar.