Validation des fichiers uploadés
Notions théoriques
1. Introduction
Lorsqu'un utilisateur envoie un fichier à une application web, il est essentiel de valider ce fichier avant de l'accepter. Une mauvaise gestion des fichiers uploadés peut entraîner des risques de sécurité, des erreurs système et des problèmes de stockage.
2. Risques liés à l'upload de fichiers
L'upload de fichiers non sécurisés peut exposer une application à plusieurs menaces :
- Exécution de code malveillant : Un fichier
.php
,.exe
ou.sh
malveillant peut être exécuté sur le serveur. - Attaque par dépassement de capacité : Un fichier trop volumineux peut saturer l'espace disque ou la mémoire.
- Injection de scripts (XSS ou SQL) : Un fichier contenant du code injecté peut être utilisé pour attaquer la base de données ou manipuler l'affichage.
- Falsification de type MIME : Un fichier
.jpg
peut en réalité être un script.php
déguisé.
3. Bonnes pratiques pour sécuriser l'upload de fichiers
Pour éviter ces risques, plusieurs règles doivent être respectées :
-
Limiter les types de fichiers autorisés
- Vérifier l'extension (
.jpg
,.png
,.pdf
, etc.). - Vérifier le type MIME (
image/jpeg
,application/pdf
, etc.). - Utiliser une liste blanche des formats acceptés.
- Vérifier l'extension (
-
Limiter la taille des fichiers
- Définir une taille maximale (ex. : 2 Mo pour une image).
- Rejeter les fichiers trop volumineux.
-
Renommer les fichiers
- Générer un nom unique pour éviter les conflits et les exécutions de scripts (
UUID
, horodatage, hash).
- Générer un nom unique pour éviter les conflits et les exécutions de scripts (
-
Stocker les fichiers en dehors du dossier public
- Empêcher leur exécution directe via le navigateur.
-
Analyser le contenu des fichiers
- Vérifier si un fichier image contient réellement une image et non du code injecté.
-
Utiliser un dossier temporaire
- Scanner les fichiers avant de les déplacer vers leur emplacement définitif.
Exemple pratique
Il est possible de sécuriser l'upload de fichiers avec Node.js et Express.js :
- en utilisant
multer
pour gérer les fichiers - et en effectuant des vérifications sur leur type et leur taille.
1. Installation des dépendances
npm install express multer path fs-extra
2. Mise en place du serveur avec validation des fichiers
const express = require("express");
const multer = require("multer");
const path = require("path");
const fs = require("fs-extra");
const app = express();
// Configuration de Multer
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, "uploads/");
},
filename: (req, file, cb) => {
const uniqueSuffix = Date.now() + "-" + Math.round(Math.random() * 1e9);
cb(null, uniqueSuffix + path.extname(file.originalname));
}
});
// Vérification du type de fichier et de la taille
const upload = multer({
storage: storage,
limits: { fileSize: 2 * 1024 * 1024 }, // 2 Mo
fileFilter: (req, file, cb) => {
const fileTypes = /jpeg|jpg|png|pdf/;
const extName = fileTypes.test(path.extname(file.originalname).toLowerCase());
const mimeType = fileTypes.test(file.mimetype);
if (extName && mimeType) {
return cb(null, true);
} else {
return cb(new Error("Type de fichier non autorisé"));
}
}
});
// Route d'upload
app.post("/upload", upload.single("file"), (req, res) => {
res.json({ message: "Fichier uploadé avec succès", file: req.file });
});
// Démarrer le serveur
app.listen(3000, () => {
console.log("Serveur démarré sur http://localhost:3000");
});
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Sécurisation de l'upload de fichiers avec Node.js et Multer
L'objectif est de créer un serveur sécurisé qui permet l'upload de fichiers avec validation stricte.
L'application devra :
- Limiter les types de fichiers acceptés (
.jpg
,.png
,.pdf
). - Restreindre la taille des fichiers à 2 Mo maximum.
- Renommer les fichiers pour éviter les conflits et les attaques.
- Stocker les fichiers dans un dossier sécurisé.
- Rejeter les fichiers suspects et afficher un message d'erreur clair.
Étape 1 : Initialisation du projet
Avant d’écrire du code, il est nécessaire de préparer l’environnement de travail.
Instructions :
- Ouvrir un terminal et naviguer vers un dossier de travail.
- Créer un nouveau dossier pour le projet :
mkdir secure-upload
cd secure-upload
- Initialiser un projet Node.js :
npm init -y
- Installer les dépendances nécessaires :
npm install express multer path fs-extra dotenv
- Vérifier que les fichiers suivants sont bien présents dans le dossier :
package.json
(créé automatiquement)node_modules/
(dossier contenant les bibliothèques installées)
Vérifier si :
- Un projet Node.js est correctement initialisé.
- Les modules Express, Multer, Path, fs-extra et dotenv sont installés.