Développement web indépendant à Montpellier

Publié le jeudi 01 août 2013 13:31:07

PHP : upload de fichiers et vérification

Si une chose est sûre, c'est que dans plus de 90% des scripts qui permettent d'uploader un fichier, la vérification effectuée est insuffisante. Dans la majorité des cas, les développeurs se contentent de vérifier que l'extension du fichier est correcte : ce n'est pas suffisant !

Nous prendrons un exemple courant : l'upload d'images puis l'upload de fichier PDF avec PHP. Nous allons voir comment bien uploader des fichiers avec PHP en toute sécurité.

voici la base du formulaire qui sera notre point de départ :

<html>
<head>
<title>Upload</title>
</head>
<body>
<?php
if(isset($_POST['go']) && is_uploaded_file($_FILES['fichier']['tmp_name'])){
    var_dump($_FILES['fichier']['tmp_name']);
}
?>
<form action="<?php $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data" method="POST">
    <input type="file" name="fichier">
    <input type="submit" name="go" value="upload" />
</form>
</body>
</html>

En gros, si un fichier est uploadé, on affiche son nom. Avant de copier le fichier sur le disque dur de notre serveur avec move_uploaded_file() ou rename() (ce qui est généralement le cas), nous devons prendre certaines précautions :

Upload d'image avec PHP

Vous pouvez utiliser les exemples ici : http://demo.ligams.free.fr/upload_php/

Dans le cas de l'upload d'image, on peut être tenté de vérifier l'extension. Cette vérification est inutile en terme de sécurité. En effet, qu'est ce qui empêche un utilisateur malveillant  de modifier l'extension d'un fichier ? rien. Oubliez dès lors la vérification de l'extension pour des raisons des sécurité.

Pour le téléchargement d'image avec PHP, c'est simple, on peut assez facilement vérifier que l'utilisateur a bien uploadé une image grâce à la fonction getimagesize() de PHP, qui prend en paramètre l'URL d'une image : cette fonction retourne false en cas d'erreur :

 if(isset($_POST['go']) && is_uploaded_file($_FILES['fichier']['tmp_name'])){
    $info = @getimagesize($_FILES['fichier']['tmp_name']);
    if($info){ // c'est une image
        var_dump($info);
        // notez qu'il est  sans doute préférable de renommer l'image
        move_uploaded_file($_FILES['fichier']['tmp_name'], __DIR__.'/'.$_FILES['fichier']['name']); 
    }else{ 
        // ce n'est pas une image
        print "erreur";
    }
}

Ainsi, on a bien uploadé une image.

Allons plus loin, imaginons que nous souhaitons n'uploader que des images au format jpeg. La fonction getimagesize() retourne un tableau contenant des informations sur l'image, dont le type MIME : c'est la clé mime de ce tableau : modifions notre script :

 if($info && $info['mime'] === 'image/jpeg'){ //..

Ainsi, on uploadera bien une image, et une image de type jpeg

Maintenant, vérifiez que le problème ne soit pas inverse et que l'utilisateur n'ait pas uploadé une image en l'appellant image.exe ... mais vous pouvez tout simplement le faire au niveau du renommage (ou vérifier l'extension...).

Upload de PDF (ou autres formats) avec PHP

Il parait plus compliqué d'utiliser getimagesize() avec un fichier PDF ;-)

En fait, l'exemple du fichier PDF ci dessous permet de tester n'importe quel type de fichier. C'est possible grâce à la classe finfo de PHP, disponible depuis la version 5.3 :

 if(isset($_POST['go']) && is_uploaded_file($_FILES['fichier']['tmp_name'])){
    // création de l'objet finfo
    $infos = new finfo(FILEINFO_MIME);
    //récupération des infos du fichier
    $type = $infos->file($_FILES['fichier']['tmp_name']);
    //extraction du type MIME
    $mime = substr($type, 0, strpos($type, ';'));
    if($mime === 'application/pdf'){ // c'est un PDF
        var_dump($info);
        // notez qu'il est  sans doute préférable de renommer
        move_uploaded_file($_FILES['fichier']['tmp_name'], __DIR__.'/'.$_FILES['fichier']['name']); 
    }else{ 
        // ce n'est pas un PDF
        print "erreur";
    }
}

Notez que la chaîne du type MIME peut varier selon la configuration de votre serveur. La classe finfo n'est pas disponible avec PHP chez FREE, vous m'excuserez, mais je n'ai pas d'exemple, testez chez vous :-)

Utilisez cette classe si vous souhaitez tester un type MIME particulier.

Articles connexes

Notez cet article !

  • Actuellement 4.5 sur 5 étoiles
  • 1
  • 2
  • 3
  • 4
  • 5

Note : 4.7/5 (18 notes attribuées)

Merci d'avoir participé !

Vous avez déjà noté cette page, vous ne pouvez la noter qu'une fois !

Votre note a été changée, merci de votre participation !

Bonne résolution ! j'arrête d'alourdir mes pages avec des boutons de partage, mais vous pouvez continuer de partager :-)

Commentaires

  1. I found a good Website with telephone numbers for customer service http://...r-service/

  2. Bonjour, ça ne fonctionne pas pour moi. Savez vous d'ou peut venir le problème ?

  3. Merci pour cet article, j'ai utilisé le code que vous avez donné pour uploader sur mes sites et ça vérifie bien.

    <a href="http://....fr/" title="Lien externe : http://...e.fr" target="_blank">http://...</a>

  4. Augusto d... | Augusto de Arruda Botelho |

    I am happy to find this post very useful for me, as it contains lot of information. I always prefer to read the quality content and this thing I found in you post. Thanks for sharing.

  5. Your work is very good and I appreciate you and hopping for some more informative posts. Thank you for sharing great information to us.

  6. i am for the first time here. I found this board and I in finding It truly helpful & it helped me out a lot. I hope to present something back and help others such as you helped me.

  7. I found a good Website with telephone numbers for customer service http://...r-service/

  8. <a href="http://...</a>
    <a href="http://...</a>
    <a href="http://...</a>
    <a href="http://...</a>

  9. Thanks for taking the time to discuss this, I feel strongly about it and love learning more on this topic.

  10. This is a great article thanks for sharing this informative information. I will visit your blog regularly for some latest post.

  11. how to cu... | how to cultivate cannabis |

    I am hoping the same best effort from you in the future as well. In fact your creative writing skills has inspired me.

  12. super article, merci pour ces infos. J'automatise des réseaux de pdf et ces infos vont forcement me servir. Cela fait plusieurs jours que je recherche sur le web mais que je ne trouve pas.
    merci,

  13. Je vous remercie pour ce site, c’est hyper intéressant.

  14. Merci pour le tuto

  15. I searched many information this disease on the Internet, because it is very unpleasant disease and embarrassed to talk about it, and then found a lot of useful information
    http://...rhoid.com/

  16. normal and relevant information with phone numbers of support services found only here
    http://...00-number/

  17. for lovers of dogs, found a cool rock, big and beautiful, here on the site there is a photo and a story about it
    http://...ardog.net/

  18. This is great information for students. This article is very helpful i really like this blog thanks. I also have some information relevant for online dissertation help.

  19. I just stumbled upon your blog and wanted to say that I have really enjoyed reading your blog posts.

  20. Ton article fait bien d'insister sur la sécurité lors d'un upload, faut prendre le temps de bien construire son script !

  21. It's a great blog post and read it twice for better knowledge. This is an impressing article which gives us good thoughts and interests to read more article like the same.

  22. It was informative to learn how to upload files with PHP safely . PDF file upload, image upload are the major things we work with. The code and detailed info you have shared above helped me to do this work without any errors. Thanks.

  23. merci pour une bonne dose d'informations

  24. Jlab | Question sécurité. |

    Bonjour.
    Est-ce que ce que ce type d'upload est sécurisé à l'heure actuelle?
    Merci

  25. bonne astuce php !!! merci
    Le succès de la loi Pinel http://...loi-pinel/ n’est pas une surprise, car il s’agissait d’un élargissement de l’avantage fiscal précédent. Avec plus de souplesse sur la période d’engagement de location : 6, 9 ou 12 ans pour le Pinel contre 9 ans pour le Duflot.

  26. Free on-line flash games site

  27. Play cost-free online Flash game

  28. I searched many information this disease on the Internet, because it is very unpleasant disease and embarrassed to talk about it, and then found a lot of useful information

  29. normal and relevant information with phone numbers of support services found only here

  30. for lovers of dogs, found a cool rock, big and beautiful, here on the site there is a photo and a story about it

  31. I like your all post. You have done really good work. I appreciate your working style at the end just my request is please share with us some more great post

  32. Nice! thank you so much! Thank you for sharing. Your blog posts are more interesting and impressive

  33. I was taking a gander at some of your posts on this site and I consider this site is truly informational!

  34. Merci, pour l'article !!!

  35. I think this is an informative post and it is very useful and knowledgeable. therefore, I would like to thank you for the efforts you have made in writing this article.

  36. anne | Pretty good post |

    Pretty good post. I just stumbled upon your blog and wanted to say that I have really enjoyed reading your blog posts. Any way I'll be subscribing to your feed and I hope you post again soon. Big thanks for the useful info.<A href="http://...post/92027
    ">crazy bulk trenorol
    </a>

  37. En tout cas, eux ils ont pris le virage du numérique.

  38. It was a very good post indeed. I thoroughly enjoyed reading it in my lunch time. Will surely come and visit this blog more often. Thanks for sharing

  39. Vous avez fait un morceau tellement intéressant à lire, en donnant à chaque sujet l'illumination pour nous d'acquérir des connaissances. Nous vous remercions de partager cette information avec nous pour lire ceci

  40. glücklich Ihrer Gemeinschaft beitreten, gibt es viele nützliche und interessante Informationen!

  41. <a href="http://...gt;wharton mba</a>
    <a href="http://...ot;>how often do dogs go in heat</a>
    <a href="http://...ot;>cat clinic</a>

    [url=http://...-programs/]wharton mba[/url]
    [url=http://...o-in-heat/]how often do dogs go in heat[/url]
    [url=http://...linic-cat/]cat clinic[/url]
    чаще первый)

  42. nice post!
    thank you

  43. [url=http://...-programs/]wharton mba[/url]

    <a href="http://...gt;wharton mba</a>

    http://...-programs/

    wharton mba

    Who knows about this site?

    thanks, very interesting. Please, look, I need help!

  44. Thank you very much for this informative post)

  45. http://...umber.com/ customer service number customer service
    http://...r-service/ comcast customer service
    http://...r-service/ comcast number customer service
    http://...r-service/ Geico customer service 1800 number
    http://...r-service/ wells fargo customer service
    http://...r-service/ wells fargo dealer services
    http://...r-service/ wells fargo login
    http://...r-service/ wells fargo routing number
    http://...m/irs-gov/ irs.gov
    http://...r-service/ bank of america customer service
    http://...r-service/ verizon customer service
    http://...r-service/ verizon wireless customer service
    http://...r-service/ verizon customer service number

  46. Je me met a fond sur le php pour mon site donc bien pratique cette méthode merci beaucoup

  47. Il existe des méthodes d'upload avec le HTML. Est-ce qu'il est conseillé de ne pas utiliser ces méthodes? Si oui, le recours aux méthodes que vous avez traitées est la seule solution pour garantir la sécurité?

  48. inazzaili... | Ninaz |

    Play kids flash games complimentary online at
    http://...amers.net/
    http://...ossip.net/
    http://...els.ninja/

    The fun endlesses with games including

  49. Des informations très utiles, bien, qui est venu à travers ce blog. Assurez-vous de l'appliquer dans la pratique.

  50. Merci pour le partage de ces informations !

  51. C Program... | C Programming Homework Help |

    This is really great work. Thank you for sharing such a good and useful information here in the blog for students.

  52. Merci pour le tuto, excellent ressource, il va falloir que je travail mon php ;)

  53. webaxis | création de site internet |

    Bonjour, je suis développeur de sites internet en stage dans une agence web et j'essaye de mettre en place votre script par contre j'ai une erreur 500 dès que j'execute le code. Est-ce que ça peut venir d'une extension PHP manquante ?
    Merci d'avance de votre réponse.

  54. Merci Stephane pour cet article, je suis dev web et ça m'a bien aidé !

  55. Thanks a lot for sharing. You have done a brilliant job. Your article is truly relevant to my study at this moment, and I am really happy I discovered your website.

  56. I like this post very much.................Because it is a nice site for posting.so that i like to post in this forum with my heart and soul excitement........................

  57. Je m'adresse à vous car j'ai jamais su quel choix il fallait faire lors d'un code en php pour un formulaire, il faut un Get ou Post , quelle différence au niveau sécurité, qu'est que ça change ?

  58. long sought this site, thanks to the author, I am happy to join your community!

  59. cool. Je vous remercie! très intéressant!

  60. Merci pour ce bout de code utile

  61. Olivier | Comment déplacer le fichier une fois uploadé ? |

    Bonjour, comment faire pour déplacer le fichier une fois uploadé ? J'ai les droit d'accés pour uploader le fichier dans un dossier spécifique mais ensuite ce fichier (image) n'est pas accessible depuis Internet (Accès refusé) et je n'arrive pas a le déplacer dans un dossier auquel j'ai accès ..
    Merci

  62. trouvé beaucoup d'informations utiles, je suis heureux de rejoindre votre communauté!

  63. récemment une faille a été détectée dans la librairie ImageMagick. Bon nombre de site internet s'en servent pour redimensionner une image suite à un upload PHP.
    Ton article fait bien d'insister sur la sécurité lors d'un upload, faut prendre le temps de bien construire son script !

  64. Il est clair que le PHP est un langage qui permet de faire énormement de choses, et personnellement c'est mon langage préféré.

  65. Vous faîtes bien de mettre l'accent sur la sécurité lors de l'upload de fichier en php sinon cela peut être très dangereux pour un serveur!

  66. Une ressource excellente avec du code propre ! Sur mon serveur http://www.eboost.fr (un annuaire web gratuit) j'accepte aussi le pgn (et je renomme d'une manière sale) l'extension en jpg.

  67. Article très intéressant ,merci

  68. J'aimé la section où vous expliquez comment le upload des fichiers PDF à portée de main.

  69. Tina | appel d'offre Tunisie |

    Pour les méthodes d'upload avec le HTML, il s'avère que j'ai tort. J'ai lu deux tutoriels l'un en relation avec HTML 5 et l'autre en relation avec PHP. C'est pour cela que j'ai mélangé les choses. Vraiment, le web est un monde vaste. Il me manque la pratique pour fixer mes idées.

  70. Des méthodes d'upload avec le html ? Non ça n'existe pas, il faut forcément que le serveur soit impliqué (vous voulez parler de dav ?).
    Cette solution n'est pas la seule solution, c'est une solution parmi d'autres, et elle a. Le mérite d'être à peu près générique et de s'appliquer plus ou moins partout.

  71. Tina | appel d'offre Tunisie |

    Il existe des méthodes d'upload avec le HTML. Est-ce qu'il est conseillé de ne pas utiliser ces méthodes? Si oui, le recours aux méthodes que vous avez traitées est la seule solution pour garantir la sécurité?