Securiser un upload !! [Résolu]

Signaler
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013
-
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013
-
Bonjour je doit faire un systeme d'upload sur un site, sans
inscriptions, donc le premier venu pourra uploader des fichiers sur le
serveur et je voulait avoir votre avis sur la securité de mon code.



function do_upload($upload_dir, $upload_url) {



$temp_name = $_FILES['userfile']['tmp_name'];

$file_name = preg_replace("/ /","_",$_FILES['userfile']['name']);

$file_type = $_FILES['userfile']['type'];

$file_size = $_FILES['userfile']['size'];

$result = $_FILES['userfile']['error'];

$file_url = $upload_url.$file_name;

$file_path = $upload_dir.$file_name;



if ( $_FILES[ 'userfile' ][ 'error' ] != 0 ) {

$message = "Erreur serveur";

return $message;

}



if ( $file_name =="") {

$message = "Nom de fichier invalide";

return $message;

}



else if ( $file_size > 200000) {

$message = "La taille du fichier est superieure a 200 Ko";

return $message;

}



else if ( $file_type == "text/plain" ) {

$message = "Desolé un ne peu pas uploader de script" ;

return $message;

}

else if ( ($file_type "application/octet-stream") ||($file_type "text/html") ) {

$message = "Desolé un ne peu pas uploader de script" ;

return $message;

}



$upload_denied_extentions = array( "exe", "pl",
"php", "php3", "php4", "php5", "phps", "asp","cgi", "html", "htm",
"dll", "bat", "cmd" );

$extension = strtolower(substr(strrchr($file_url, "."), 1));

foreach ($upload_denied_extentions AS $denied_extention) {

if($denied_extention == $extension) {


$message = "Desolé un ne
peu pas uploader de script" ;

return $message;

}

}





$result = move_uploaded_file($temp_name, $file_path);

$message = ($result)?"Chemin a copier/coller $file_url" :

"Probleme avec cet upload, dsl";

return $message;

}





Sinon j'ai supprimé :

$rep=dir(images);

while($fichier = $rep->read())

{

if($fichier!="." && $fichier!="..")

{

++$cpt;

}

}

if ($cpt > 15) {

$message = "Le quota de fichier total sur le serveur a été depassé cette semaine";

}



et



if (file_exists('images/'.$_FILES['userfile']['name'])) {

$message = "Il ya deja un fichier avec ce nom";

}

8 réponses

Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
Salut,

je pense résumer la situation ici : Sécuriser un upload en PHP

a +
<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
Messages postés
510
Date d'inscription
samedi 29 décembre 2001
Statut
Membre
Dernière intervention
23 mai 2008

Bah tout dépend de ce que les utilisateurs vont uploader...si c'est un des fichiers mp3, video, image, à ce moment là tu empêche l'upload d'autre fichiers...


----------------------
La lumière étant plus rapide que le son, un homme peu paraître brillant avant qu'il se mette a parler
-----------------
Messages postés
510
Date d'inscription
samedi 29 décembre 2001
Statut
Membre
Dernière intervention
23 mai 2008

Désolé pour le flood, mais y'a un problème : lorsque tu isole l'extention tu ne prends pas en compte le fait que dans le nom du fichier il puisse y avoir plusieurs "." donc si jamais j'upload un fichier qui se nomme : page.lol.html le fichier devrais passer...
donc je te conseille de faire plutôt comme ca :

$extention_var = explode('.', $file_url);
$extention _len = count($file_url);
$extention = $zone_explode[$extention _len-1];

$upload_denied_extentions = array( "exe", "pl", "php", "php3", "php4", "php5", "phps", "asp","cgi", "html", "htm", "dll", "bat", "cmd" );
$extention_var = explode('.', $file_url);
$extention _len = count($file_url);
$extention = $zone_explode[$extention _len-1]; foreach ($upload_denied_extentions AS $denied_extention) {
if($denied_extention == $extension) {
$message = "Desolé un ne peu pas uploader de script" ;
return $message;
}
}

Voila, je ne suis pas sur du meilleur fonctionement de mon code, mais ca me semble plausible

Bon dev ++

----------------------
La lumière étant plus rapide que le son, un homme peu paraître brillant avant qu'il se mette a parler
-----------------
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

J'ai refait des tests le fichier page.lol.html ne passe pas vu que le code prend uniquement la derniere extension.



Sur ton site Anthomicro j'ai vu la methode infaillible (???) pour les images avec la commande getimagesize().
Je pense que je vait rajouter ca vu que ce sera en grande partie des
images, mais si je voulait aussi permettre les .zip ???



Sinon encore une question la commande getimagesize() n'est elle pas trop gourmande en ressource serveur ???
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
"Sinon encore une question la commande getimagesize() n'est elle pas trop gourmande en ressource serveur ???"

J'ai pas fait de bench mais bon c'est sûr que c'est plus gourmand que de regarder le type mime envoyé.

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

En fait javais vu sur un site qu'il y avait moyen de gruger
$_FILES['userfile']['type']; a condition d'avoir son propre serveur
d'ou l'utilité de getimagesize() pour les images.
En fait c'etait pour savoir si quelqu'un voyait une faille dans mon
controle des extentions vu que je pense que ce sera le plus utile..
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
tu contrôles que les extensions et quelques types basiques, si j'étais toi je mettrais seulement les types mime autorisés, par contre regarde la source de coucou qui permet de justement faire passer un faux type mime (d'où l'utilisation du getimagesize() pour les images)
<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

C'est pour ca que je ne me fie pas au type mime, et que je compte surtout sur les extensions.

Je vire egalement les espaces au cas ou la personne mette fichier.php .jpg.

Et dans le cas present getimagesize() et fiable a 100/100 (je pense)
pour les images mais si c'est un autre format de fichier je suis obligé
de m'en remettre a mon controle d extensions.



Je vais laisser trainer ce post 1 jour ou 2 des fois que quelqu'un voye
une faille mais pour le moment je crois que je vais partir sur uploader
uniquement les images pour le libre accés et sur enregistrement pour
les format type *zip ou *.doc