UPLOADEUR DE FICHIERS MULTIPLES V1

Morphinof Messages postés 255 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 9 août 2013 - 29 mars 2011 à 12:02
begueradj Messages postés 273 Date d'inscription dimanche 4 octobre 2009 Statut Membre Dernière intervention 24 juin 2014 - 24 avril 2011 à 15:48
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/52956-uploadeur-de-fichiers-multiples-v1

begueradj Messages postés 273 Date d'inscription dimanche 4 octobre 2009 Statut Membre Dernière intervention 24 juin 2014 9
24 avril 2011 à 15:48
merci beaucoup pour votre réponse Cod75
cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
24 avril 2011 à 14:36
BONJOUR

la réponse est là
http://phpcodeur.net/articles/php/upload
il faut eviter de faire injecter un shell par une image detournée

on peut pousser la protection du repertoire upload par un .htaccess sur un serveur apache

.htaccess

Options -Indexes
Options -ExecCGI
AddHandler cgi-script .php .php3 .php4 .phtml .pl .py .jsp .asp .htm .shtml .sh .cgi
#Disabling executing of these files
#could give us an extra layer of protection.
#Further if you are allowing your users only photos
#or picturer, you can restrict other files by placing
#the following code your your .htaccess file.
<Files ^(*.jpeg|*.jpg|*.png|*.gif)>
order deny,allow
deny from all
</Files>

a++
begueradj Messages postés 273 Date d'inscription dimanche 4 octobre 2009 Statut Membre Dernière intervention 24 juin 2014 9
24 avril 2011 à 14:08
J'ai une question bête car je suis bête:

Pourquoi le fait qu'un noùm de fichiers contienne des caractères '#[\x00-\x1F\x7F-\x9F/\\\\]#' est un mauvais signe ?
aspkiddy Messages postés 38 Date d'inscription jeudi 9 juin 2011 Statut Membre Dernière intervention 15 janvier 2014
11 avril 2011 à 18:23
Super COD57,

J'ai fait comme tu dis : j'ai créée le répertoire "upload" et j'ai redefini les droits sur ce répertoire... Alors Ça marche sans erreur...

Merci pour les explication sur pypeg et jpeg...

Bonne journée
cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
8 avril 2011 à 20:57
bonsoir

j'ai retesté mon script sur ovh php 5 , free en php 5, en local wamp2(apache), easyphp, il tourne !

@Server Error
500 - Internal server error.
There is a problem with the resource you are looking for, and it cannot be displayed.

oui sans doute le repertoire ... 'chmod' et une commande unix pas 'windows' faudrait
changé les droits sous le serveur iis
soit le fichier est copié mais injoignable soit il l'est pas present du tout.
tu devrais ecrire ce fichier à la main (creer un repertoire upload).

@mkdir($rep, 0705); marche pas sous windows

copy ? bon peut toujours essayer
is_uploaded_file
move_uploaded_file
mais je crois pas que ce soit ça

le type mine
c'est image/pjpeg sous ie
et image/jpeg pour chrome firefox (va savoir pourquoi)
donc il suffit de remplacer
if($v['type'][$ti]==="image/pjpeg"){
par
if($v['type'][$ti]==="image/pjpeg" or $v['type'][$ti]==="image/jpeg"){

a++
aspkiddy Messages postés 38 Date d'inscription jeudi 9 juin 2011 Statut Membre Dernière intervention 15 janvier 2014
8 avril 2011 à 18:40
Bonjour cod57,

Excellent code pour une application local...

je l'ai testé sur mon ordi, localement, sous Windows (localhost)

Ça marche...

par contre, j'ai changé la ligne 123 où il y a le mime (type) de jpeg pour que ça marche avec JPG

Il fallait écrire "image/jpeg" au lieu de "image/pjpeg"

voici le bon : if($v['type'][$ti]==="image/jpeg"){

par contre, ton code ne marche pas lorsque le met sur un serveur externe (comme goDady) sous Windows (iis)

Voici le message d'erreur :

Warning: copy(upload/04-08-2011-10-07-4d9f32b284398coul.gif) [function.copy]: failed to open stream: Permission denied in D:\Hosting\4568795\html\testr\ftp\index3.php on line 171

et le code de cette ligne est le suivant :

copy($f,$path);

alors, je l'ai mis sur un autre serveur externe sous Windows (iis)

quand je clique sur le bouton "Upload" Ça ne marche pas non plus :
Server Error
500 - Internal server error.
There is a problem with the resource you are looking for, and it cannot be displayed.

Alors à mon avis, il faut ajouter aussi d'autres codes au niveau de droit d'écriture... Mais je ne sais pas ce qu'il faut écrire...

Bon courage
Morphinof Messages postés 255 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 9 août 2013 4
29 mars 2011 à 15:22
Pour l'extension je pensais en fait a un bête tableau associant l'extension du fichier avec son extension mime histoire de dire je reçois un .jpeg alors son extension mime est => image/pjpeg.

Oui c'est un article très intéressant j'ai beaucoup aime ^^

Ça serai bien que quelqu'un qui s'y donnai donne son avis, je suis curieux dans ce domaine :)
cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
29 mars 2011 à 13:46
@morphinof

Merci pour tes remarques elles sont à prendre en compte !
Oui en effet on peut ameliorer le script qui n'est qu'une base de travail

$ext = pathinfo($_FILES['fichier']['name'], PATHINFO_EXTENSION);
interressant je peux alors comparer à $extension

comparer le mine avec l'extension
mine -> image/pjpeg et jpg ou jpeg?
ça me semble plus hasardeux peut etre penses tu as truc du genre
exemple :
$mine="image/pjpeg";
$mine=substr($mine,-4);
if($mine===$extension) ...

le nom unique là les méthodes ne manque pas chacun decide
md5(uniqid('H', 5)); oui je pense aussi que c'est mieux

\x00-\x1F\x7F-\x9F remarque judicieuse
http://phpcodeur.net/articles/php/upload
j'ai lu l'article aussi (-:

if( preg_match('#[\x00-\x1F\x7F-\x9F/\\\\]#', $name_file) )
{
exit("Nom de fichier non valide");
}
else if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )
{
exit("Impossible de copier le fichier dans $content_dir");
}

a++ bne prog
Morphinof Messages postés 255 Date d'inscription vendredi 20 avril 2007 Statut Membre Dernière intervention 9 août 2013 4
29 mars 2011 à 12:02
Tu t'embetes pour recuperer l'extention de ton fichier :

$ext = pathinfo($_FILES['fichier']['name'], PATHINFO_EXTENSION); et hop ! :)
Ton script est une bonne base mais on peu l'améliorer :

Tu devrai vérifier les caractères du nom du fichier : if(preg_match('#[\x00-\x1F\x7F-\x9F/\\\\]#', $file)) si il contient un de ces caractères c'est plutôt mauvais signe ^^

Chaque fichier a un nom unique mais je pense que md5(uniqid('H', 5)); suffit pour avoir un nom assez unique.

Tu vérifie bien le type mime mais tu ne vérifie pas que l'extension concorde, c'est toujours une sécurité de plus.

Pour être encore plus sécurisé l'idéal serai de regarder le contenu du fichier mais ca deviens plus complexe du coup.

Voila ce qui me viens a l'esprit après je suis loin d'être bon en secu ^^
Rejoignez-nous