(PHP 4 >= 4.0.3, PHP 5)
is_uploaded_file — Indique si le fichier a été téléchargé par HTTP POST
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.