uploader un fichier

A

Anonyme

Invité
Bonjour
J'ai trouvé sur un site (http://phpcodeur.net/ qui a l'air mort !) un script pour uploader. Je rencontre des problèmes :

Le script :

-----------------------------------------------------​
<?php

if( isset($_POST['upload']) ) // si formulaire soumis
{
$content_dir = 'upload/'; // dossier où sera déplacé le fichier

$tmp_file = $_FILES['fichier']['tmp_name'];

if( !is_uploaded_file($tmp_file) )
{
exit("Le fichier est introuvable");
}

// on vérifie maintenant l'extension
$type_file = $_FILES['fichier']['type'];

if( !strstr($type_file, 'jpg') && !strstr($type_file, 'jpeg') && !strstr($type_file, 'bmp') && !strstr($type_file, 'gif') )
{
exit("Le fichier n'est pas une image");
}

// on copie le fichier dans le dossier de destination
$name_file = $_FILES['fichier']['name'];

if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )
{
exit("Impossible de copier le fichier dans $content_dir");
}

echo "Le fichier a bien été uploadé";
}

?>
-----------------------------------------------------​
J'ai créé un dossier "upload" à la racine.
Et j'obtiens comme message d'erreur :

Warning: move_uploaded_file(upload/fichier.jpg) [function.move-uploaded-file]: failed to open stream: No such file or directory in /home/leprof/public_html/traitement/upload.php on line 26

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpfUAW7A' to 'upload/fichier.jpg' in /home/leprof/public_html/traitement/upload.php on line 26
Impossible de copier le fichier dans upload/

Question idiote : à quoi sert / dans le nom du dossier ?

Merci pour votre aide

Albert
 
Hello,

Il faut que tu vérifies les autorisations du dossier dans lequel tu veux uploader tes fichiers. Celles-ci doivent permettre au script d'écrire et de lire dans ce dossier.
 
Hello,

Il faut que tu vérifies les autorisations du dossier dans lequel tu veux uploader tes fichiers. Celles-ci doivent permettre au script d'écrire et de lire dans ce dossier.

Bonjour et merci

Il est bien en 777 (j'ai compris hier soir ce que cela voulait dire)
Mais pourquoi diable doit-il se nommer upload/ et pas upload ?
Alabert
 
C'est pour différencier le dossier d'un fichier. En informatique, un dossier est un fichier, il faut donc pouvoir les différencier.

Une autre erreur que j'ai notée qui te donnera peut-être une piste : ton path pour le dossier où tu veux mettre ton fichier est upload/ à mon avis il te manque une partie avant (par exemple /home/leprof/public_html/upload/ serait probablement un meilleur chemin).
 
C'est pour différencier le dossier d'un fichier. En informatique, un dossier est un fichier, il faut donc pouvoir les différencier.

Une autre erreur que j'ai notée qui te donnera peut-être une piste : ton path pour le dossier où tu veux mettre ton fichier est upload/ à mon avis il te manque une partie avant (par exemple /home/leprof/public_html/upload/ serait probablement un meilleur chemin).

Bien vu merci, le chemin était mal libellé.

Ce dossier de réception doit il être obligatoirement à la racine du site ?


Et encore une question : le nom de l'utilisateur qui va envoyer sa photo est dans une variable. Est-il possible de renommer le fichier envoyé par le nom de l'utilisateur ?

Albert
 
Bien vu merci, le chemin était mal libellé.

Ce dossier de réception doit il être obligatoirement à la racine du site ?


Et encore une question : le nom de l'utilisateur qui va envoyer sa photo est dans une variable. Est-il possible de renommer le fichier envoyé par le nom de l'utilisateur ?

Albert

Bah, oui au lieu de $name_file tu mets ta variable ici :

if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )
 
merci, ça marche, c'était tout bête.
Albert

Comme vous l'avez constaté je ne suis pas un grand expert. Donc une question peut-être naïve ?
En imposant le nom du fichier, cela m'évite-t-il les intrusions malintentionnées ? J'ai lu ici qu'on pouvait entre un programme dans un champ et faire des dégâts dans le serveur.
Merci
Albert
 
Si quelqu'un se sert de ton script d'upload pour envoyer un fichier .php par exemple, il pourra ensuite appeler la page php qu'il a envoyé et exécuter le script qui s'y trouve, et donc faire des dégâts. Donc oui il faut faire attention. En principe il suffit de contrôler l'extension du fichier, pour s'assurer que le fichier est bien une image. C'est ce que fait ton script, qui vérifie qu'il s'agit bien de gif, png, jpeg ou bmp.
C'est l'extension seule qui permet d'identifier le fichier, donc tu n'est pas à l'abris que quelqu'un renomme un script en .jpg&#8230; sauf que, en fait si, parce que apache se base aussi sur l'extension pour savoir quels fichiers interpréter, donc si il s'appelle .jpg, il ne l'interpretera pas, même s'il contient un script.
Par contre, comme tu veux renommer le fichier après l'avoir vérifié, assure toi bien de lui remettre son extension d'origine ! Si tu lui mets juste le pseudo de la personne, sans l'extension, un utilisateur mal intentionné va pouvoir mettre pseudo.php dans le pseudo, et donc exploiter la faille ! (encore qu'il faut qu'apache ait les droits d'exécution, je suis pas certain que ce soit le cas par défaut sur un fichier uploadé, mais c'est bien possible que si puisqu'il en est le créateur, donc il faut vérifier)
 
Si quelqu'un se sert de ton script d'upload pour envoyer un fichier .php par exemple, il pourra ensuite appeler la page php qu'il a envoyé et exécuter le script qui s'y trouve, et donc faire des dégâts. Donc oui il faut faire attention. En principe il suffit de contrôler l'extension du fichier, pour s'assurer que le fichier est bien une image. C'est ce que fait ton script, qui vérifie qu'il s'agit bien de gif, png, jpeg ou bmp.
C'est l'extension seule qui permet d'identifier le fichier, donc tu n'est pas à l'abris que quelqu'un renomme un script en .jpg… sauf que, en fait si, parce que apache se base aussi sur l'extension pour savoir quels fichiers interpréter, donc si il s'appelle .jpg, il ne l'interpretera pas, même s'il contient un script.
Par contre, comme tu veux renommer le fichier après l'avoir vérifié, assure toi bien de lui remettre son extension d'origine ! Si tu lui mets juste le pseudo de la personne, sans l'extension, un utilisateur mal intentionné va pouvoir mettre pseudo.php dans le pseudo, et donc exploiter la faille ! (encore qu'il faut qu'apache ait les droits d'exécution, je suis pas certain que ce soit le cas par défaut sur un fichier uploadé, mais c'est bien possible que si puisqu'il en est le créateur, donc il faut vérifier)
Bonjour et merci pour cette longue explication.
Il y a une chose que je n'arrive pas à comprendre : un malveillant envoie donc sur mon serveur un script.php qui va être renommé Dupont par exemple. Comme fait-il pour déclencher la lecture et l'exécution du script à distance ?

Si j'ai bien compris je n'ai qu'à ajouter l'extension jpg par exemple à tous les fichiers qui sont uploadés : pas besoin forcément de récupérer l'extension d'origine ? Dis-je une bêtise ?

J'ai écrit ceci :
$nom2=$nom."."."jpg";

if( !move_uploaded_file($tmp_file, $content_dir . $nom2) )
{
exit("Impossible de copier le fichier dans $content_dir");

}

Merci encore

Albert
 
Si tu utilises une mauvaise extension, le navigateur du client risque de ne pas arriver à interpréter correctement l'image.
Pour déclencher l'exécution du script, rien de plus simple, il suffit de taper son adresse, de la même façon qu'on tape l'adresse de ton script d'upload, une fois qu'il est sur le serveur c'est plutôt facile.
 
Si tu utilises une mauvaise extension, le navigateur du client risque de ne pas arriver à interpréter correctement l'image.
Pour déclencher l'exécution du script, rien de plus simple, il suffit de taper son adresse, de la même façon qu'on tape l'adresse de ton script d'upload, une fois qu'il est sur le serveur c'est plutôt facile.

C'est aussi simple que ça !

C'est vraiment risqué de mettre l'extension jpg à toutes les photos ? je n'arrive pas à ajouter l'extension d'origine.

Albert
 
C'est aussi simple que ça !

C'est vraiment risqué de mettre l'extension jpg à toutes les photos ? je n'arrive pas à ajouter l'extension d'origine.

Albert

Bloc de code:
$extension = substr($name,strrpos($name,"."));

C'est pas risqué, le seul risque c'est que les images qui n'ont pas la bonne extension ne puissent pas s'afficher. On appelle ça un bug. ;)
 
Bloc de code:
$extension = substr($name,strrpos($name,"."));

C'est pas risqué, le seul risque c'est que les images qui n'ont pas la bonne extension ne puissent pas s'afficher. On appelle ça un bug. ;)

Merci. J'ai testé (pas tout) mais en mettant l'extension jpg, ça a l'air de marcher. Ca me facilite la récupération du fichier à la bonne place.
Merci
Albert