is_uploaded_file

(PHP 3>= 3.0.17, PHP 4 >= 4.0.3, PHP 5)

is_uploaded_file -- Diz se o arquivo foi uploaded via HTTP POST

Descrição

bool is_uploaded_file ( string filename )

Retorna TRUE se o arquivo com o nome filename foi uploaded via HTTP POST. Isto é útil para ter certeza que um usuário malicioso, não está tentando confundir o script em trabalhar em arquivos que não deve estar trabalhando --- por exemplo, /etc/passwd.

Este tipo de confirmação é importante principalmente se existe alguma chance que qualquer coisa feita com os arquivos carregados poderiam revelar o seu conteúdo para o usuário, ou mesmo para outros usuários no mesmo sistema.

is_uploaded_file() está disponível somente em versões do PHP 3 depois da 3.0.16 e em versões do PHP 4 posteriores a 4.0.2. Se você ainda está utilizando uma versão anterior, você pode utilizar o seguinte código para se proteger:

Nota: O exemplo seguinte não funcionará em versões do PHP posteriores a 4.0.2. Isto depende de uma funcionalidade interna do PHP que mudou depois dessa versão.

<?php
/* Teste de arquivo carregado pelo usuário */
function is_uploaded_file($filename) {
    if (!
$tmp_file = get_cfg_var('upload_tmp_dir')) {
        
$tmp_file = dirname(tempnam('', ''));
    }
    
$tmp_file .= '/' . basename($filename);
    
/* Pode haver uma barra no final do php.ini... */
    
return (ereg_replace('/+', '/', $tmp_file) == $filename);
}

/* Utilize isto se por acaso você não tiver
* move_uploaded_file() em versões antigas: */
if (is_uploaded_file($HTTP_POST_FILES['userfile'])) {
    
copy($HTTP_POST_FILES['userfile'], "/place/to/put/uploaded/file");
} else {
    echo
"Possível ataque de carregamento de arquivo: filename '$HTTP_POST_FILES[userfile]'.";
}
?>

Veja também move_uploaded_file() e a seção Manipulando upload de arquivos para um exemplo de utilização desta função.