Comment sécuriser son dossier d'uploads efficacement ?
- Comment sécuriser son dossier d'uploads ?
- Comprendre les risques (sans se noyer dans la technique)
- Durcir le serveur : empêcher l'exécution dans uploads
- Valider côté application : extension, MIME, et contenu réel
- Limiter la taille, le volume, et les scénarios d'abus
- Nommage et stockage : éviter les URLs devinables
- Droits d'accès : le minimum indispensable
- Nettoyer, transformer, neutraliser
- Surveiller et réagir : logs, alertes, et tests simples
Un dossier d'uploads, c'est la porte d'entrée la plus pratique d'un site... et souvent la plus négligée. On y dépose des images, des PDF, parfois des fichiers audio, et tout roule. Jusqu'au jour où un fichier « pas tout à fait innocent » se glisse dans le lot. Là, votre site devient une maison avec une fenêtre ouverte au rez-de-chaussée : facile à forcer, difficile à surveiller.
Le piège, c'est que l'upload paraît banal. Pourtant, il touche à tout : sécurité serveur, droits d'accès, validation côté formulaire, exécution de scripts. Et si vous gérez un site pour un client, vous le savez déjà : un incident sur l'upload, ça ne pardonne pas. On va donc traiter le sujet comme un webmaster prudent le ferait, étape par étape, avec des actions concrètes, testables, et pas trop douloureuses à mettre en place.
Comment sécuriser son dossier d'uploads ?
Avant de parler réglages, posez une règle simple : tout fichier envoyé doit être considéré comme suspect. Même si l'utilisateur est connecté. Même si c'est « juste une image ». Même si ça vient d'un collaborateur. C'est un réflexe, pas une parano.
Et gardez en tête l'objectif : empêcher qu'un fichier puisse se faire passer pour autre chose, éviter qu'il soit exécutable, limiter les dégâts si quelqu'un tente sa chance, et garder une traçabilité minimale. Votre dossier d'uploads doit ressembler à un entrepôt verrouillé, pas à un atelier où n'importe qui peut bricoler.
Comprendre les risques (sans se noyer dans la technique)
Le risque le plus connu, c'est l'upload d'un script (PHP, CGI, etc.) puis son appel via une URL. Si le serveur l'exécute, l'attaquant obtient un levier. Pas toujours un contrôle total, mais souvent assez pour déposer d'autres fichiers, lire des configs, ou injecter du contenu.
Autre souci, plus discret : des fichiers « valides » en apparence, mais piégés. Exemple : une image avec du code caché, un PDF conçu pour exploiter une faille côté lecteur, ou un fichier avec une double extension du style photo.jpg.php. Ça ressemble à une photo, ça finit parfois comme une porte dérobée.
Enfin, il y a le danger bête mais fréquent : un dossier listable, des noms devinables, et tout devient consultable. Un export, une facture, un scan de pièce d'identité... et vous avez une fuite de données sur les bras. Dans ce cas, la faille n'est pas « spectaculaire », juste coûteuse.
Durcir le serveur : empêcher l'exécution dans uploads
Première barrière : interdire l'exécution de scripts dans le dossier d'uploads. C'est le cadenas sur la porte. Selon votre stack, la méthode change, mais l'intention reste la même : les fichiers stockés ici ne doivent jamais être interprétés comme du code.
Cas Apache (règles locales)
Si vous utilisez Apache et que .htaccess est autorisé, vous pouvez couper l'exécution et forcer des types de contenu prudents. Une règle classique consiste à désactiver l'exécution PHP et à bloquer certaines extensions. L'idée n'est pas d'écrire un roman de directives : quelques lignes nettes, testées, puis oubliées.
Astuce terrain : après chaque changement, uploadez un fichier inoffensif (une image) et vérifiez qu'il s'affiche, puis testez qu'un faux fichier .php ne s'exécute pas (il doit être téléchargé ou renvoyer une erreur).
Cas Nginx (règles côté vhost)
Sur Nginx, tout se joue dans la конфигурация du serveur : un bloc location dédié à /uploads qui refuse les extensions dangereuses et sert les fichiers en statique uniquement. Si vous déléguez l'hébergement, demandez explicitement ce point. Un prestataire sérieux saura quoi faire.
Valider côté application : extension, MIME, et contenu réel
Le filtrage ne doit jamais reposer sur l'extension seule. Pourquoi ? Parce qu'elle se falsifie en une seconde. Vous voulez une validation en couches : extension autorisée, type MIME annoncé, et contrôle du contenu réel (au moins pour les images).
Concrètement, fixez une liste blanche : par exemple jpg, png, webp, pdf. Rien d'autre. Pas de « on verra plus tard ». Ensuite, comparez le MIME détecté par le serveur (pas celui envoyé par le navigateur). Pour les images, utilisez une fonction qui lit réellement le fichier (type getimagesize côté PHP). Si la lecture échoue, vous refusez.
Petite nuance utile : acceptez des cas courants, mais restez ferme. Un webp mal formé ? Refus. Un « jpeg » qui n'en est pas un ? Refus. C'est parfois frustrant, mais c'est votre job de garder la porte étroite.
Limiter la taille, le volume, et les scénarios d'abus
On pense sécurité = malware. Pourtant, un upload peut aussi servir à saturer vos ressources. Donc imposez des limites claires : taille maximale par fichier, nombre de fichiers par formulaire, et quotas par utilisateur si vous avez un espace membre.
Quelques repères concrets : 5 Mo pour une image « standard » est déjà confortable, 15 Mo pour un PDF peut suffire dans beaucoup de cas. Si votre usage exige plus, très bien, mais assumez-le et adaptez l'infra (stockage séparé, CDN, scan antivirus, etc.).
Ajoutez aussi une protection contre la rafale : un rate limit côté application ou via le serveur (ou un WAF). Parce qu'un robot peut envoyer 200 fichiers en quelques minutes. Et là, ce n'est plus un formulaire, c'est un tapis roulant. [ Voir ici aussi ]
Nommage et stockage : éviter les URLs devinables
Un nom de fichier du type devis-final-ok.pdf, c'est parlant... et devinable. Préférez un nom généré, unique, sans information métier, par exemple un UUID. Gardez le nom original en base de données si nécessaire, mais pas dans l'URL publique.
Encore mieux : stockez hors du webroot quand c'est possible. Le dossier d'uploads n'a pas l'obligation d'être accessible directement. Vous pouvez servir les fichiers via un script qui vérifie les droits, ou via un serveur de fichiers dédié. Oui, ça demande un peu plus de travail. Mais côté confidentialité, c'est le jour et la nuit.
Si vous devez garder l'accès direct (site vitrine avec images publiques), séparez : un répertoire public pour les médias « safe » (images recompressées), et un autre, non exposé, pour les documents sensibles. La séparation des usages, c'est une hygiène simple qui évite bien des drames.
Droits d'accès : le minimum indispensable
Sur le serveur, appliquez le principe du moindre privilège. Le processus web doit pouvoir écrire dans le dossier d'uploads, oui. Il n'a pas besoin d'y avoir tous les droits du monde. Visez des permissions raisonnables, et évitez absolument les dossiers en 777. On le voit encore trop, et ça fait mal.
Côté lecture, posez-vous la question : qui doit voir quoi ? Un espace client ne devrait pas exposer des fichiers à d'autres comptes, même via une URL. Si vous ne contrôlez pas l'accès, vous laissez les clés sur la porte.
Nettoyer, transformer, neutraliser
Pour les images, une méthode très efficace consiste à les retransformer côté serveur : vous chargez l'image, vous la ré-encodez (JPEG/PNG/WebP) et vous enregistrez la nouvelle version. Cela supprime souvent les données cachées et standardise le fichier. Bonus : vous pouvez réduire le poids sans casser la qualité.
Pour les documents (PDF surtout), c'est plus délicat. À minima, évitez de les rendre exécutables, et envisagez un scan antivirus si votre volume d'uploads est significatif. Ce n'est pas un bouclier absolu, mais c'est une ceinture de sécurité.
Surveiller et réagir : logs, alertes, et tests simples
La sécurité, c'est aussi savoir quand quelque chose cloche. Logguez les uploads : identifiant utilisateur, IP, nom original, taille, résultat (accepté/refusé). Pas pour espionner, juste pour comprendre. Un pic d'échecs d'upload à 3 h du matin ? Ça mérite un coup d'œil.
Programmez un contrôle régulier : repérer les extensions interdites, les fichiers trop gros, ou les noms suspects. Et si vous voulez une image mentale : considérez le dossier d'uploads comme une cave. Si vous n'y descendez jamais, vous serez surpris le jour où ça sent mauvais.
Dernière pratique très concrète : mettez en place un fichier leurre (honeypot) ou un chemin d'upload non utilisé, surveillé. Si quelqu'un tente d'y envoyer un fichier, vous recevez une alerte. C'est discret, peu coûteux, et ça donne souvent un temps d'avance quand une automatisation attaque votre site.
👉 Lire aussi: Comment créer un flux RSS sur son site php custom ?

