Vérifier la taille d'un fichier
Le
Pascale

Bonjour,
Dans un formulaire qui permet d'uploader du texte et des images, j'utilise
(depuis fort longtemps) <input type="hidden" name="MAX_FILE_SIZE"
value="50000">.
Ensuite, du côté PHP, je fais un certain nombre de contrôles pour m'assurer
que le fichier est bien un jpg et pas autre chose. En particulier :
$contenu1=getimagesize($_FILES['photo1']['tmp_name']);
$type1=$contenu1[2];
if ($type1!=2) { echo 'Erreur';}
Si le fichier téléchargé est trop lourd, getimagesize me renvoie une
erreur.
J'ai conscience que ce n'est pas très propre comme solution et que je
devrais spécifiquement vérifier la taille du fichier que la personne a
tenté de télécharger, d'autant que c'est l'erreur la plus courante commise
par les utilisateurs.
Le mieux est-il de vérifier tout bêtement la taille du fichier dans
$_FILES['photo1']['size'] ou vaut-il mieux vérifier le contenu de
$_FILES['photo1']['error'] ? Ou bien ?
--
Pascale
http://www.la-grille-verte.net
Dans un formulaire qui permet d'uploader du texte et des images, j'utilise
(depuis fort longtemps) <input type="hidden" name="MAX_FILE_SIZE"
value="50000">.
Ensuite, du côté PHP, je fais un certain nombre de contrôles pour m'assurer
que le fichier est bien un jpg et pas autre chose. En particulier :
$contenu1=getimagesize($_FILES['photo1']['tmp_name']);
$type1=$contenu1[2];
if ($type1!=2) { echo 'Erreur';}
Si le fichier téléchargé est trop lourd, getimagesize me renvoie une
erreur.
J'ai conscience que ce n'est pas très propre comme solution et que je
devrais spécifiquement vérifier la taille du fichier que la personne a
tenté de télécharger, d'autant que c'est l'erreur la plus courante commise
par les utilisateurs.
Le mieux est-il de vérifier tout bêtement la taille du fichier dans
$_FILES['photo1']['size'] ou vaut-il mieux vérifier le contenu de
$_FILES['photo1']['error'] ? Ou bien ?
--
Pascale
http://www.la-grille-verte.net
ça vaut ce que ça vaut, y'a probablement mieux, je ne suis pas spécialiste
du PHP
<?php
$phpmaxfilesize = ini_get('upload_max_filesize');
$sitemaxfilesize = 2097152;
/* non utilisé ici */
$uploaderror=array(UPLOAD_ERR_OK=>'Chargement correct',
UPLOAD_ERR_INI_SIZE=>'Fichier plus gros que le maximum autorisé sur
le serveur',
UPLOAD_ERR_FORM_SIZE=>'Le fichier téléchargé excède la taille
autorisée sur le site',
UPLOAD_ERR_PARTIAL=>'Le fichier n'a été que partiellement
téléchargé',
UPLOAD_ERR_NO_FILE=>'Aucun fichier n'a été téléchargé',
UPLOAD_ERR_NO_TMP_DIR=>'Un dossier temporaire est manquant',
UPLOAD_ERR_CANT_WRITE=>'Échec de l'écriture du fichier sur le
disque',
UPLOAD_ERR_EXTENSION=>'Autre erreur de chargement'
);
/* http://www.iana.org/assignments/media-types/ */
$applicationtype=array('application/justbecause0canbefaulty',
'application/msword',
'application/ogg',
'application/pdf',
'application/rtf',
'application/vnd.ms-excel',
'application/vnd.ms-powerpoint',
'application/vnd.ms-project',
'application/vnd.oasis.opendocument.chart',
'application/vnd.oasis.opendocument.graphics',
'application/vnd.oasis.opendocument.presentation',
'application/vnd.oasis.opendocument.spreadsheet',
'application/vnd.oasis.opendocument.text',
'application/vnd.oasis.opendocument.text-master',
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/x-compress',
'application/x-compressed',
'application/x-zip',
'application/x-zip-compressed',
'application/zip',
'audio/mpeg',
'audio/ogg',
'audio/vnd.rn-realaudio',
'audio/x-ms-wma',
'audio/x-wav',
'image/gif',
'image/jpeg',
'image/png',
'image/tiff',
'multipart/x-zip',
'text/plain',
'video/mp4',
'video/ogg',
'video/quicktime',
'video/x-flv',
'video/x-ms-wmv',
'video/x-msvideo'
);
$document = $_FILES['filetoupload']['name'];
$taille = $_FILES['filetoupload']['size'];
$tmp = $_FILES['filetoupload']['tmp_name'];
$type = $_FILES['filetoupload']['type'];
$ferror = $_FILES['filetoupload']['error'];
if (!empty($document) && (!array_search($type, $applicationtype) ||
($taille > $sitemaxfilesize)))
{
$taille = $taille / 1024;
echo "<p class="erreur">Erreur : Votre fichier ".$document." de taille
".$taille." ko, de type ".$type." est trop gros ou de type non
autorisé.</p>n";
$erreur="1";
}
?>
--
Utilisant le client e-mail révolutionnaire d'Opera :
http://www.opera.com/mail/
À quoi te sert ce champ ?
Dans l'absolu, tu vas quand même utiliser getimagesize pour t'assurer
que le fichier est une image, donc ce n'est pas choquant comme usage.
La taille spécifiée dans $_FILES est celle donnée par le navigateur,
ce n'est donc pas une information fiable.
Avant mieux, il y a correct :p
Alors pourquoi encombrer l'exemple avec du code qui va faire couiner
PHP ? (les E_NOTICE dues aux clés mal spécifiées)
[snip]
Ça correspond à quoi ça ?
[snip]
[snip]
Plein de parenthèses inutiles.
Ton code ne s'assure pas que le fichier est bien du type que le
navigateur l'a affirmé (ce que PHP donne dans
$_FILES['filetoupload']['type']).
Gros trou de sécurité (XSS).
Bref, au moins ça t'aura permis de corriger ton code, que de donner
de mauvais conseils ;)
parcer que c'est du copier-coller d'un include, et donc je spécifie que ça
n'a pas d'utilité ICI, pour éviter au questionneur de chercher à quoi ça
sert
non, ça m'a permis de constater qu'il y a éventuellement des erreurs, mais
tu ne donnes aucune piste de correction, ni en quoi ce sont des erreurs.
je vois des critiques, mais aucune piste d'amélioration
pour le petit site dont je m'occupe, mon code, bien que non parfait, a
l'avantage d'être fonctionnel.
--
Utilisant le client e-mail révolutionnaire d'Opera :
http://www.opera.com/mail/
Merci pour ta réponse... tout ça est bien compliqué pour ma petite
cervelle, je vais voir ce que je peux en tirer.
Mais je n'ai pas fini de m'arracher les cheveux : le même programme avec
les mêmes tests derrière ne fonctionne pas pareil chez mon hébergeur actuel
et chez mon futur hébergeur canadien. Je m'explique :
J'ai pour l'instant une limite de taille d'image à 50 Ko, telle que définie
dans mon MAX_FILE_SIZE mentionné précédemment. Et bien, sur chez le nouvel
hébergeur (que je commence à regretter d'avoir choisi, le support est
catastrophiquement absent), pour qu'une photo passe, il faut qu'elle soit
nettement plus petite que 50 Ko : je ne sais pas exactement où se trouve la
limite, mais par exemple, une photo de 49,5 Ko passera sur le site actuel,
par contre, elle ne passera pas chez le nouvel hébergeur ! Je n'ai fait
aucune modification dans les programmes.
Au s'cours, si quelqu'un pouvait me sortir de cette histoire de fous...
--
Pascale
http://www.la-grille-verte.net
parce qu'il y a 2 limites
celles de ton hébergeur, et les tiennes
$phpmaxfilesize = ini_get('upload_max_filesize');
normalement, ça donne celles de ton hébergeur
sinon, phpmyadmin() doit te donner les valeurs
--
Utilisant le client e-mail révolutionnaire d'Opera :
http://www.opera.com/mail/
Oui, mais mon idée était de différencier le cas où le fichier est trop gros
et le cas où le fichier n'est pas un vrai jpg, histoire d'avoir un message
d'erreur plus « parlant ».
Je comprends. Par contre aurais-tu une idée pour cette histoire de taille
de fichier qui commence à me faire tourner en bourrique ? Mêmes programmes,
mêmes tests, même limite de taille de fichier chez Planet-Work (mon
hébergeur actuel) et PlanetHoster (le futur hébergeur de la-grille-verte),
et une photo qui passe chez Planet-Work ne passe pas chez PlanetHoster, il
faut que je la réduise un peu plus... grmbl.
--
Pascale
http://www.la-grille-verte.net
Ok. Dans ce cas, il suffit de demander à l'OS la taille du fichier ;)
Quelque chose dans ce goût là :
filesize($_FILES['xxx']['tmp_namehéhé']);
Comme l'a proposé DuboisP, tu devrais regarder le paramétrage de ton
hébergeur. Ceci dit, je serais plus violent : mauvais hébergeur, changer
hébergeur ;)
Ben il faut virer ce qui est inutile. Et le copier-coller de ce qu'on
ne comprend pas, c'est la porte ouverte à tout les vilains qui ont
besoin de points d'attaque.
Ce n'est n'est pas potentiel : il y a d'énormes trous de sécurité qui
rendent le site qui l'utilise vulnérable à toutes les attaques connues.
Bien sûr que j'ai donné des pistes : XSS. La littérature est très
volubile à ce sujet.
Oui, surtout pour les pirates.
et en te rajoutant ça dans le copier-coller, tu es plus heureux ?
$document=strip_tags(document);
$document=stripslashes($document);
$document=mysql_real_escape_string($document);
--
Utilisant le client e-mail révolutionnaire d'Opera :
http://www.opera.com/mail/