Tratamento de dados fornecidos pelo usuário: projetando sistemas com mais segurança

De uns tempos para cá comecei a notar que mais gente está programando e conseqüentemente mais gente está entrando no mercado de trabalho precocemente. Estão iniciando sua viagem pelo maravilhoso mundo do desenvolvimento web muito inocentemente, no entanto não sabem eles - os desenvolvedores newbies ou negligentes - que existem usuários maliciosos olho no seu sistema.

[ Hits: 88.098 ]

Por: Ragen Dazs em 07/04/2004 | Blog: http://www.orkut.com


O que é SQL injection



Como o próprio nome diz, SQL injection nos sugere uma injeção de código SQL. Usarei alguns exemplos simples para ilustrar como devem ser feitos os tratamentos de dados e posteriormente continuarei com exemplos de ataques.

Imagine o seguinte trecho de script:

<?php
$sql = "DELETE FROM cadastros WHERE id_cadastro=" . $_GET['id'];
?>

Agora tire suas próprias conclusões. Suponha que o usuário acessasse a URL:

http://www.teste.com.br/script.php?id=1+OR+1;

O que aconteceria?
Se a tabela "cadastros" tiver permissão de escrita, TODOS os cadastros ali contidos seriam deletados. Como eu citei na frase anterior, é preciso que a tabela tenha permissão de escrita - que por sua vez é definida nos seus respectivos bancos de dados, seja seu BD MySQL, Postgree, MSQL, Oracle etc (Cada um com sua peculiaridade, mas primitivamente funcionam da mesma forma).

Outro exemplo de query SQL:

<?php
$sql = "SELECT * FROM login WHERE usuario=".$_POST['usuario']." AND senha=".$_POST['senha'];
?>

Outro código sem erro de semântica, porém ele possui um grave erro - conseqüentemente o sistema que utiliza esse sistema de login está esperando para ser "invadido".

Agora o que aconteceria se o usuário digitasse: | OR "1=1" | no login e senha?

Nota: O caracter Pipe "|" foi usado para delimitar o comando.

Então,
$_POST['usuario'] = NULL OR 1=1 (usuário é falso ou verdadeiro -> saída sempre verdadeira)
$_POST['senha'] = NULL OR 1=1 (senha é falsa ou verdadeira -> saída sempre verdadeira)

Agora que você já conhece alguns tipos "clássicos" de SQL injection, vamos iniciar na parte de tratamento de dados, mais especificamente no escapamento de strings.

Página anterior     Próxima página

Páginas do artigo
   1. Início
   2. Descrição do ambiente
   3. Tratando dados
   4. O que são códigos arbitrários
   5. O que é SQL injection
   6. Escapando strings
   7. Coringas e meta caracteres
   8. Escapando argumentos em shell
   9. O que são casts
   10. Denial of Service em sua página
   11. Cross site script
   12. Explorando falhas locais
   13. Agradecimentos
Outros artigos deste autor

Instalando o Allegro

Montando um workstation de desenvolvimento web em GNU/Linux

Verdades e mentiras sobre tecnologias WEB

Referências ou ponteiros em PHP

O comércio eletrônico e o Linux

Leitura recomendada

Introdução ao Anonimato na Web - Web Anonimity

Bloqueando e desbloqueando falhas de login em SSH usando o pam_tally2

AUDIT: Auditoria de arquivos no Linux para conhecer quem fez alterações em arquivos

13 dicas de segurança para o Apache

Chroot + Bind sem stress

  
Comentários
[1] Comentário enviado por gustavo_marcon em 07/04/2004 - 19:19h

Cara, muito legal mesmo teu artigo, só achei que vc poderia ter dado uns toques de comandos que podem ser usados pra evitar por exemplo o SQL Injection, mas no mais, tá 10 mesmo. Parabéns.

[2] Comentário enviado por Ragen em 08/04/2004 - 00:31h

Olá Gustavo,

Note que logo abaixo de "O que é SQL injection" tem o que você quer "Escapando Strings", nessa parte é abordado como evitar os bendidos códigos maliciosos...

Só queria fazer mais um pequeno comentário:

Na parte onde eu falo sobre netcat eu fiz algumas pequenas mudanças desde a data de publicação do arquivo, por que eu deixo o assunto muito vago e sem nenhum exemplo concreto do seu uso....

Esse mesmo artigo pode ser encontrado em http://www.florecultura.com.br/bkp/artigo_tratamento.txt

[]`s

Ragen

[3] Comentário enviado por fabio em 11/04/2004 - 14:39h

Putz, acabou que com uma dica sua resolvi de forma trivial um problema que tinha no sistema de busca interno do site. Por exemplo, se você digitasse "sites celular" nada era encontrado. Daí mandei o sistema substituir espaços por %, agora buscas com palavras compostas funcionam. :)

Valeu pela dica!!!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts