Securiser un upload !!

Résolu
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013 - 15 déc. 2005 à 11:05
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013 - 17 déc. 2005 à 11:33
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

cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
15 déc. 2005 à 13:40
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>
3
WhiteDwarf Messages postés 510 Date d'inscription samedi 29 décembre 2001 Statut Membre Dernière intervention 23 mai 2008
15 déc. 2005 à 11:52
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
-----------------
0
WhiteDwarf Messages postés 510 Date d'inscription samedi 29 décembre 2001 Statut Membre Dernière intervention 23 mai 2008
15 déc. 2005 à 12:02
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
-----------------
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
15 déc. 2005 à 21:20
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 ???
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
15 déc. 2005 à 22:35
"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>
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
16 déc. 2005 à 13:02
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..
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
16 déc. 2005 à 23:00
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>
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
17 déc. 2005 à 11:33
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
0
Rejoignez-nous