# Des plans de permis de construire exposés dans un dossier d’uploads accessible sans authentification

> Un cabinet d'architectes stocke des plans confidentiels de projets en cours dans un dossier d'uploads WordPress librement consultable. Comment cette exposition a été découverte et corrigée.

- Auteur : WordPress Développement
- Publié le : 2022-03-28
- Mis à jour le : 2022-03-28
- Catégorie : Sécurité
- URL : https://www.wpmoderne.fr/securite/plans-permis-construire-dossier-public-expose/

## L’essentiel

- Un dossier d'uploads est public par défaut sur WordPress
- Un nom de fichier difficile à deviner ne remplace jamais un contrôle d'accès
- La correction passe par un stockage hors racine web

340 fichiers PDF de plans de permis de construire, associés à des projets clients en cours et non encore déposés officiellement : c'est ce qu'un cabinet d'architectes a découvert accessible à quiconque connaissait ou devinait leur chemin, sans aucune authentification requise. La cause : un dossier `wp-content/uploads` recevant, sans distinction, des images destinées au site public et des documents confidentiels destinés à un usage strictement interne.

Le stockage externalisé de gros fichiers (solutions dédiées de partage de documents volumineux) ne fait pas l'objet de cet article : le cabinet utilisait directement le dossier d'uploads natif de WordPress pour stocker ces plans, générés par une extension de gestion de projets clients installée sur leur site, sans avoir mesuré que ce dossier reste, par conception, librement accessible depuis le web dès lors que l'on connaît son chemin exact.

## Un comportement par défaut de WordPress souvent mal compris

Le dossier `wp-content/uploads` n'implémente, en configuration standard, aucun contrôle d'accès basé sur l'identité du visiteur. N'importe quel fichier qui y est déposé devient accessible par son URL directe, indépendamment de la connexion ou non de l'utilisateur au site. Cette conception convient parfaitement à des images de blog ou des documents destinés à être publics ; elle devient un problème dès lors qu'un fichier confidentiel y est stocké par erreur, en pensant que la structure de dossiers, elle-même peu visible, offrira une protection suffisante.

## Comment l'exposition a été découverte

> L'essentiel à retenir : Un dossier d'uploads est public par défaut sur WordPress ; Un nom de fichier difficile à deviner ne remplace jamais un contrôle d'accès ; La correction passe par un stockage hors racine web

Un membre du cabinet a remarqué, en effectuant une recherche sur son propre nom sur un moteur de recherche, qu'un des fichiers PDF apparaissait indexé, avec un aperçu du contenu visible directement dans les résultats. Ce fichier avait été partagé par lien direct avec un client, sans restriction, et le moteur de recherche l'avait indexé naturellement en suivant ce lien externe, révélant du même coup l'existence du dossier complet.

```
site:cabinet-exemple.fr filetype:pdf
```

Cette simple recherche a permis de mesurer l'ampleur réelle de l'exposition : bien au-delà du seul fichier initialement repéré.

## La correction : sortir les documents sensibles de la racine web

La solution retenue consiste à déplacer les documents confidentiels en dehors du dossier `uploads` accessible publiquement, vers un répertoire situé hors de la racine web servie par le serveur, puis à les servir uniquement via un script PHP qui vérifie l'authentification et les droits du visiteur avant d'en livrer le contenu :

```
function servir_plan_projet( $projet_id ) {
    if ( ! is_user_logged_in() || ! current_user_can( 'voir_projet', $projet_id ) ) {
        wp_die( 'Accès refusé', 403 );
    }

    $chemin = WP_CONTENT_DIR . '/../plans-prives/' . $projet_id . '.pdf';
    header( 'Content-Type: application/pdf' );
    readfile( $chemin );
    exit;
}
```

Cette fonction, appelée via une route dédiée plutôt qu'une URL directe vers le fichier, garantit qu'aucun document ne peut plus être consulté sans passer par la vérification des droits.

### Empêcher l'indexation en attendant la migration complète

Le temps de migrer l'ensemble des documents existants, un fichier `robots.txt` excluant le dossier concerné, combiné à un en-tête `X-Robots-Tag: noindex` sur les réponses de ce dossier, a limité une nouvelle indexation le temps que la correction structurelle soit déployée. Ce n'est qu'une mesure provisoire : elle n'empêche pas un accès direct, elle limite seulement l'indexation par les moteurs de recherche.

## Auditer les extensions existantes pour éviter la récidive

L'extension de gestion de projets utilisée par le cabinet a depuis été reconfigurée pour écrire systématiquement ses fichiers générés hors du dossier `uploads`, avec l'accord de son éditeur qui proposait déjà cette option, simplement non activée par défaut.

> Un dossier d'uploads WordPress n'a jamais été conçu comme un espace de stockage confidentiel : tout ce qui y est déposé doit être considéré comme potentiellement public, quelle que soit la difficulté apparente à en deviner le chemin.

## En résumé

Stocker des documents sensibles dans le dossier d'uploads natif de WordPress, même avec des noms de fichiers peu évidents, revient à compter sur une protection qui n'existe pas. Le vrai correctif consiste à sortir ces fichiers de la racine web et à les servir uniquement à travers une vérification d'authentification et de droits, comme cela aurait dû être fait dès la conception du système.
