O perigo no gerenciador de uploads do PHP

O PHP é capaz de receber o upload de qualquer browser que siga a norma RFC-1867, o que permite o upload de arquivos cliente => servidor. Ele ainda provê o controle total de quem pode fazer o upload e o que fazer com o arquivo após sua transferência, mas mesmo com esse controle, somente poucas pessoas sabem do perigo real do mal uso desse recurso.

[ Hits: 29.410 ]

Por: Ragen Dazs em 03/11/2003 | Blog: http://www.orkut.com


Tratando o processo de upload



Então continuando... Os arquivos serão guardados no diretório temporário do servidor a menos que outro lugar seja especificado com a opção upload_tmp_dir no php.ini. O diretório padrão do servidor pode ser mudado se mudando o valor da variável de ambiente TMPDIR no ambiente onde o PHP esta sendo executado PHP. Mudando-a com putenv() de um script PHP não irá funcionar. Esta variável de ambiente também pode ser usada para se ter certeza que outras operações estão funcionando no arquivo do upload.

Note que deve se definir upload_temp_dir no php.ini ou TMPDIR, não podendo estarem ambos vazios, sendo recomendado no mínimo upload_tmp_dir.

Agora vamos ao que interessa: vamos validar o upload de arquivos.

O seguinte exemplo irá processar o envio de um arquivo que vem de um formulário:

<?php
// Nas versões anteriores a 4.1.0, $HTTP_POST_FILES deve ser usado ao invés de $_FILES.
// Nas versões anteriores a 4.0.3, use copy() e is_uploaded_file() ao invés move_uploaded_file

$uploaddir = '/var/www/uploads/';

print "<pre>";
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir . $_FILES['userfile']['name'])) {
print "O arquivo é valido e foi carregado com sucesso. Aqui esta alguma informação:\n";
print_r($_FILES);
} else {
print "Possível ataque de upload! Aqui esta alguma informação:\n";
print_r($_FILES);
}
?>

O script PHP que irá receber o arquivo do upload deve implementar qualquer lógica que for necessária para determinar o que deve ser feito com o arquivo do upload. Você pode, por exemplo, usar a variável $_FILES['userfile']['size'] para descartar qualquer arquivo que seja muito pequeno ou muito grande. Você pode usar a variável $_FILES['userfile']['type'] para descartar qualquer arquivo que não seja de um certo tipo.

Desde o PHP 4.2.0, você pode usar $_FILES['userfile']['error'] e planejar a sua lógica de acordo com os códigos de erro. Qualquer que seja a lógica, você deve excluir o arquivo do diretório temporário ou movê-lo para outro lugar.

O arquivo será excluído do diretório temporário ao fim do script se não tiver sido movido ou renomeado.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Tratando o processo de upload
   3. is_uploaded_file() e move_uploaded_file()
Outros artigos deste autor

Sejamos todos filhos da p***

DotGNU: a resposta Open Source ao dotNET

O comércio eletrônico e o Linux

Verdades e mentiras sobre tecnologias WEB

XSS - Um exemplo de ataque

Leitura recomendada

Enviar mensagem ao usuário trabalhando com as opções do php.ini

Gerando documentos PDF com a classe FPDF no PHP

Trabalhando com arquivos em PHP

PEAGLE: Serviço Web de busca indexada em seu servidor local

Organizando fotos de camêra digital

  
Comentários
[1] Comentário enviado por pmichelazzo em 20/01/2004 - 10:28h

Meu caro, esse não é um artigo mas sim uma cópia do manual do PHP com algumas alterações nanicas aqui e ali. Não seria mais honrado escrever um artigo verdadeiramente?

Perdi meu tempo pois tudo o que li aqui, já tinha lido no manual do PHP e nada me acrescentou.

Paulino Michelazzo

[2] Comentário enviado por Ragen em 12/02/2004 - 17:05h

Caro michelazzo,

Não foi à toa que coloquei "Fonte: Manual do PHP" no rodapé do texto. Mas da proxima vez, antes de usar algo já escrito, farei uma citação antes do mesmo e não mais no rodapé do texto.

[]`s

Ragen


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts