# CV de candidats indexés par un moteur de recherche via une URL ouverte

> Des dizaines de CV déposés sur un site de recrutement apparaissaient dans les résultats d'un moteur de recherche, faute d'un contrôle d'accès sur leur URL de téléchargement.

- Auteur : Clément Hadrot
- Publié le : 2025-02-10
- Mis à jour le : 2025-02-10
- Catégorie : Sécurité
- URL : https://wpmoderne.dev.wordpress-developpement.fr/securite/cv-candidats-indexes-moteur-recherche-url-ouverte/

## L’essentiel

- Les fichiers PDF étaient servis depuis une URL prévisible et non protégée
- Aucune directive robots ne bloquait le dossier de téléversement
- La correction combine droits de dossier et jeton d'accès temporaire

Un cabinet de recrutement tape le nom d'un de ses candidats dans un moteur de recherche généraliste, par simple curiosité, et tombe directement sur le CV en PDF que cette personne avait déposé sur le site quelques semaines plus tôt. Le document n'était protégé par aucun mot de passe, aucun jeton, rien qui empêche son indexation par un robot d'exploration classique. L'audit qui a suivi cette découverte a permis de dénombrer quarante-sept CV accessibles de la même manière.

Cet article ne traite pas du tri automatique des candidatures, sujet fonctionnel distinct : il se concentre sur la faille d'accès qui a permis cette indexation, un problème beaucoup plus fréquent qu'on ne l'imagine sur les sites qui gèrent des dépôts de fichiers.

## Le mécanisme de la fuite

Le formulaire de candidature, construit à partir d'une extension de formulaires classique, enregistrait chaque CV téléversé dans le dossier `wp-content/uploads/`, à un chemin dérivé directement du nom de fichier original et de la date de dépôt. Rien n'empêchait un robot d'indexation de découvrir ces fichiers, soit en les trouvant via un lien mal protégé dans l'espace d'administration exposé par erreur, soit simplement en explorant le dossier `uploads` listé sans restriction par le serveur web.

## Pourquoi `uploads` n'est pas un coffre-fort

> L'essentiel à retenir : Les fichiers PDF étaient servis depuis une URL prévisible et non protégée ; Aucune directive robots ne bloquait le dossier de téléversement ; La correction combine droits de dossier et jeton d'accès temporaire

Le dossier `wp-content/uploads/` est, par nature, un espace public : tout fichier qui y est stocké est servi directement par le serveur web, sans passer par WordPress ni par un contrôle de capacité. C'est un choix de conception qui convient parfaitement aux images d'un article de blog, mais qui devient dangereux dès qu'on y dépose des documents personnels ou confidentiels sans réflexion supplémentaire.

```
# Extrait de configuration Apache observé, insuffisant seul
<Directory "/var/www/site/wp-content/uploads">
  Options -Indexes
</Directory>
```

Cette directive empêche uniquement le listage du contenu du dossier ; elle ne bloque en rien l'accès direct à un fichier dont l'URL exacte est connue ou devinée, ni son indexation si un lien vers ce fichier existe quelque part sur le web.

## La correction retenue

Trois changements ont été mis en œuvre :

- Les CV ne sont plus stockés dans `wp-content/uploads/`, mais dans un dossier privé situé hors de la racine web, inaccessible directement par une URL.
- Le téléchargement d'un CV par un recruteur passe désormais par un point de terminaison authentifié, qui vérifie la capacité `edit_candidatures` avant de servir le fichier.
- Un fichier `robots.txt` à jour interdit explicitement l'exploration du dossier historique, en complément défensif, le temps que les anciens liens sortent des index.

```
function servir_cv_candidat($id_candidature) {
  if (!current_user_can('edit_candidatures')) {
    wp_die('Accès refusé', 403);
  }
  $chemin = get_post_meta($id_candidature, 'chemin_cv', true);
  if (!$chemin || !file_exists($chemin)) {
    wp_die('Fichier introuvable', 404);
  }
  header('Content-Type: application/pdf');
  readfile($chemin);
  exit;
}
```

## Demander le retrait des pages déjà indexées

Pour les documents déjà présents dans l'index d'un moteur de recherche, le déplacement du fichier ne suffit pas : une demande de suppression d'URL a été soumise via l'outil de gestion pour webmasters du moteur concerné, accompagnée d'un code de retour `410 Gone` renvoyé sur les anciennes adresses, afin d'accélérer leur retrait effectif des résultats.

## Une question à se poser pour tout formulaire de dépôt

Chaque fois qu'un formulaire permet à un visiteur de déposer un fichier destiné à rester privé — CV, pièce d'identité, devis, contrat — la question de son emplacement de stockage doit se poser avant la mise en production, pas après une fuite constatée. Un fichier confidentiel ne devrait jamais reposer sur la seule difficulté de deviner son URL.

## En résumé

L'indexation de documents confidentiels ne résulte presque jamais d'un piratage actif : elle vient d'un choix de stockage par défaut mal adapté à la sensibilité des données. Sortir les fichiers privés de la racine web accessible et les servir via un contrôle de capacité explicite règle durablement ce type de fuite silencieuse.
