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.

[ Hits: 22.375 ]

Por: Mario Monteiro em 08/07/2008


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.

Página anterior    

Páginas do artigo
   1. Ataques
   2. Como evitar ataques
Outros artigos deste autor

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

Leitura recomendada

MongoDB Aggregation

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

Como criar VIEWS no MySQL

Implementação LDAP e Java

Instalação da Plataforma Hadoop

  
Comentários
[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!!

[2] Comentário enviado por xKuRt em 08/07/2008 - 11:56h

Ficou bem básico, mas contém algumas noções legais sobre o assunto.

Gostaria de sugerir uma leitura complementar:

Segurança em programação PHP
Parte 1 - http://www.htmlstaff.org/ver.php?id=1356
Parte 2 - http://www.htmlstaff.org/ver.php?id=1357

[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.

[9] Comentário enviado por willium532 em 18/11/2022 - 05:38h

I am also looking for a solution, Because I am also getting a same issue. Please help!!!
https://www.ariseportal.org/


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts