# Bloquer l’upload de fichiers exécutables sur un formulaire de candidature

> Un CV déposé sur un formulaire de recrutement peut cacher un script exécutable déguisé en document. Voici comment verrouiller le dépôt de fichier étape par étape.

- Auteur : Clément Hadrot
- Publié le : 2026-02-24
- Mis à jour le : 2026-02-24
- Catégorie : Sécurité
- URL : https://wpmoderne.dev.wordpress-developpement.fr/securite/bloquer-upload-fichiers-executables-formulaire-candidature/

## L’essentiel

- L'extension déclarée par le fichier ne garantit rien sur son contenu réel
- La vérification du type MIME réel complète le contrôle d'extension
- Le dossier de dépôt doit interdire l'exécution de tout script

« candidature-jean-dupont.pdf.php » : un nom de fichier de ce type, déposé sur un formulaire de candidature mal protégé, peut suffire à exécuter du code arbitraire sur un serveur si aucune vérification sérieuse ne filtre le dépôt. Un cabinet de recrutement qui reçoit des dizaines de CV chaque semaine via son site WordPress représente une cible particulièrement exposée à ce type de tentative, car le dépôt de fichier y est une fonctionnalité attendue et légitime, pas une exception qu'on peut simplement désactiver. Ce tutoriel ne traite pas du tri automatique des candidatures, sujet fonctionnel distinct : il détaille, étape par étape, comment verrouiller le dépôt lui-même.

## Étape 1 : ne jamais se fier à l'extension seule

Un contrôle limité à l'extension du fichier, du type `str_ends_with($nom, '.pdf')`, se contourne trivialement en renommant un fichier malveillant. La première étape solide consiste à vérifier le type MIME réel du contenu, indépendamment du nom déclaré :

```
function domaine_verifier_type_reel($chemin_temporaire) {
  $type_reel = mime_content_type($chemin_temporaire);
  $types_autorises = array('application/pdf', 'application/msword',
    'application/vnd.openxmlformats-officedocument.wordprocessingml.document');
  return in_array($type_reel, $types_autorises, true);
}
```

Cette vérification s'appuie sur l'analyse réelle des premiers octets du fichier, pas sur une déclaration fournie par le navigateur qui envoie la requête, elle-même potentiellement falsifiée.

## Étape 2 : utiliser wp_check_filetype_and_ext

> L'essentiel à retenir : L'extension déclarée par le fichier ne garantit rien sur son contenu réel ; La vérification du type MIME réel complète le contrôle d'extension ; Le dossier de dépôt doit interdire l'exécution de tout script

WordPress fournit une fonction native pensée précisément pour ce contrôle croisé entre extension déclarée et type réel du fichier :

```
$verification = wp_check_filetype_and_ext(
  $chemin_temporaire,
  $nom_fichier_original
);

if (empty($verification['ext']) || empty($verification['type'])) {
  wp_die('Type de fichier non autorisé.');
}
```

Cette fonction s'appuie sur la liste des types MIME autorisés par WordPress, filtrable via `upload_mimes`, et refuse tout fichier dont l'extension et le contenu réel ne correspondent pas à une combinaison connue et cohérente.

## Étape 3 : restreindre explicitement la liste des extensions

Le filtre `upload_mimes` permet de restreindre, pour ce formulaire précis, la liste aux seuls formats réellement attendus pour un CV, en excluant tout autre type par ailleurs autorisé sur le reste du site :

```
add_filter('upload_mimes', function ($mimes) {
  return array(
    'pdf'  => 'application/pdf',
    'doc'  => 'application/msword',
    'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
  );
}, 10, 1);
```

## Étape 4 : interdire l'exécution dans le dossier de dépôt

Même avec un contrôle de type rigoureux, une défense supplémentaire consiste à garantir que le dossier où atterrissent les CV ne puisse jamais exécuter de script, quel que soit son contenu réel. Sur un serveur Apache, un fichier `.htaccess` dédié au dossier de dépôt applique cette restriction :

```
<FilesMatch "\.(php|php5|phtml|pl|py|cgi)$">
  Require all denied
</FilesMatch>
```

Sur Nginx, la configuration équivalente refuse l'exécution PHP pour ce chemin précis, directement au niveau du bloc serveur, avant même que la requête n'atteigne WordPress.

## Étape 5 : renommer systématiquement le fichier stocké

Le nom de fichier fourni par le candidat ne doit jamais être conservé tel quel pour le stockage physique. Un identifiant généré côté serveur, associé au nom d'origine uniquement dans les métadonnées de la candidature, évite toute tentative d'injection via un nom de fichier contenant des caractères spéciaux ou des séquences de traversée de répertoire :

```
$nom_stockage = wp_generate_password(20, false) . '.' . $verification['ext'];
```

## Étape 6 : limiter la taille et scanner si possible

Une limite de taille raisonnable, cohérente avec un CV réel (quelques mégaoctets au plus), évite les dépôts anormalement volumineux. Lorsque l'infrastructure le permet, un passage du fichier par un scanner de malware serveur, avant son intégration définitive au dossier de candidature, ajoute une dernière couche de vérification indépendante du code applicatif.

## En résumé

Un formulaire de dépôt de CV combine plusieurs couches de vérification qui, prises isolément, restent contournables : contrôle du type réel, restriction stricte des extensions, interdiction d'exécution dans le dossier cible et renommage systématique. Ensemble, elles réduisent fortement le risque qu'un document déguisé en CV se transforme en point d'entrée pour du code exécutable.
