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.
Parte 2: 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:
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);
}
?>
// 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.
Perdi meu tempo pois tudo o que li aqui, já tinha lido no manual do PHP e nada me acrescentou.
Paulino Michelazzo