is_uploaded_file

(PHP 4 >= 4.0.3, PHP 5)

is_uploaded_file — Indique si le fichier a été téléchargé par HTTP POST

Description

bool is_uploaded_file ( string $filename )

is_uploaded_file() est disponible à partir des versions PHP 3.0.16 et 4.0.2.

is_uploaded_file() retourne TRUE si le fichier filename a été téléchargé par HTTP POST. Cela est très utile pour vous assurer qu'un utilisateur n'essaie pas d'accéder intentionnellement à un fichier auquel il n'a pas droit (comme /etc/passwd ).

Ce type de vérification est spécialement important s'il est possible que les fichiers téléchargés révèlent leur contenu à l'utilisateur, ou même aux utilisateurs du même système.

Pour un fonctionnement correct, la fonction is_uploaded_file() nécessite un argument comme $_FILES['userfile']['tmp_name'], - le nom du fichier téléchargé sur la machine cliente $_FILES['userfile']['name'] ne fonctionne pas.

Exemple 803. Exemple avec is_uploaded_file()

<?php

if ( is_uploaded_file ( $_FILES [ 'userfile' ][ 'tmp_name' ])) {
    echo 
"Fichier " $_FILES [ 'userfile' ][ 'name' ] . " téléchargé avec succès.\n" ;
    echo 
"Affichage du contenu\n" ;
    
readfile ( $_FILES [ 'userfile' ][ 'tmp_name' ]);
} else {
    echo 
"Attaque possible par téléchargement de fichier : " ;
    echo 
"Nom du fichier : '" $_FILES [ 'userfile' ][ 'tmp_name' ] .  "'." ;
}

?>

is_uploaded_file() est disponible dans les versions de PHP 3 après PHP 3.0.16, et dans les versions de PHP 4 après la 4.0.2. Si vous êtes coincés avec une version plus ancienne, vous pouvez utiliser l'une des fonctions suivantes pour vous protéger :

Note: L'exemple suivant ne fonctionne pas avec les versions de PHP ultérieures à la 4.0.2. Elle dépend de fonctionnalités internes de PHP qui ont disparu après cette version.

Exemple 804. Exemple avec is_uploaded_file() en PHP 4 < 4.0.3.

<?php
/* Test utilisateur du fichier téléchargé. */
function  is_uploaded_file_4_0_2 ( $filename ) {
    if (!
$tmp_file  get_cfg_var ( 'upload_tmp_dir' )) {
        
$tmp_file  dirname ( tempnam ( '' '' ));
    }
    
$tmp_file  .=  '/'  basename ( $filename );
    
/* L'utilisateur peut avoir laissé des / finaux dans php.ini... */
    
return ( ereg_replace ( '/+' '/' $tmp_file ) ==  $filename );
}

/* Voici comment l'utiliser, car move_uploaded_file() n'est pas disponible
dans les anciennes versions : */
if ( is_uploaded_file_4_0_2 ( $HTTP_POST_FILES [ 'userfile' ])) {
    
copy ( $HTTP_POST_FILES [ 'userfile' ],  "/dossier/ou/placer/un/fichier/uploadé" );
} else {
    echo 
"Tentative d'attaque possible : '$HTTP_POST_FILES[userfile]'." ;
}
?>

Voir aussi move_uploaded_file() , et la section sur la gestion des téléchargements pour un exemple simple.