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.013 ]

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


Coringas e meta caracteres



Coringas ou metacaracteres são recursos utilizados por muitos sistemas de busca, como por exemplo o Google para permitir que o usuário monte expressões complexas de procura.

Mostrarei alguns exemplos abaixo do seu uso... Depois de terminada a leitura eu gostaria de saber se é complicado roubar os dados de algum portal que não os protegem devidamente.

Suponhamos:

Temos o registro "Allyson Francisco de Paula Reis" em nossa coluna `nomes`

mysql> SELECT * FROM nomes WHERE key_col LIKE %Allyson de Paula%;

Retornaria o registro citado anteriormente...

mysql> SELECT * FROM nomes WHERE key_col LIKE %Allyson Paula%;

Não retornaria nada...

mysql% SELECT * FROM nomes WHERE key_col LIKE %Allyson%Paula%;

Retornaria o registro do primeiro código;

A combinação de padrões SQL lhe permite usar _ para coincidir qualquer caracter simples e % para coincidir um número arbitrário de caracteres (incluindo zero caracter).

Para encontrar nomes começando com `b':

mysql> SELECT * FROM pet WHERE name LIKE "b%";
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+


Para encontrar nomes com o final `fy':

mysql> SELECT * FROM pet WHERE name LIKE "%fy";
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+


Para encontrar nomes contendo um `w':

mysql> SELECT * FROM pet WHERE name LIKE "%w%";
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+


Para encontrar nomes contendo exatamente cinco caracteres, use cinco instâncias do caracter `_':

mysql> SELECT * FROM pet WHERE name LIKE "_____";
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+


Então me digam meus senhores, sabendo o que vocês sabem sobre metacaracteres seria complicado fazer uma query sempre válida? Seria difícil fazer um shell script para baixar as paginações recursivamente de um site de busca usando o wget (software para download), ou lynx --dump (cliente em modo texto) que não se protege devidamente?

Enfim... Se não conhecem wget e lynx, recomendo que pesquisem sobre os mesmos, pois o restante do texto precisa que vocês tenham pelo menos um mínimo conhecimento sobre os mesmos.

wget: http://www.gnu.org/software/wget/wget.html
lynx: http://lynx.browser.org/

OBS: Novamente gostaria de salientar que não vou aprofundar nesse assunto por que o artigo ficaria muito extenso.

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

O comércio eletrônico e o Linux

Usando cache na classe Fast Template

O perigo no gerenciador de uploads do PHP

Instalando o Allegro

Adaptação das empresas de TI aos trabalhadores da era digital

Leitura recomendada

Tornando o OpenBSD stable

Desvendando código malicioso no fórum Viva o Linux

Proteção utilizando fail2ban contra ataques do tipo

Autenticação via hardware: o módulo pam_usb

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

  
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