|
8.38.58 is_uploaded_file()
Indique si le fichier a été téléchargé par HTTP POST
[ Exemples avec is_uploaded_file ] PHP 3 >= 3.0.17, PHP 4 >= 4.0.3, PHP 5
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 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 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.
|