# Chiffrer un export CSV de licenciés avant de le transmettre à une fédération sportive

> Un club sportif doit envoyer chaque saison la liste de ses licenciés à sa fédération. Recette pour éviter qu'un fichier nominatif ne traîne en clair sur le serveur.

- Auteur : WordPress Développement
- Publié le : 2020-11-09
- Mis à jour le : 2020-11-09
- Catégorie : Sécurité
- URL : https://www.wpmoderne.fr/securite/export-csv-licencies-chiffrer-federation/

## L’essentiel

- Un export généré traîne souvent plus longtemps que prévu
- Le chiffrement au repos coûte quelques lignes de code
- La clé ne doit jamais voyager avec le fichier

`wp sodium_compat_is_fallback` : cette simple vérification en ligne de commande permet de confirmer que l'extension libsodium, disponible nativement depuis PHP 7.2, tourne bien en mode natif sur le serveur d'un club sportif plutôt qu'en mode de compatibilité logiciel, plus lent. C'est le point de départ d'une recette utile à tout club, association ou fédération amenée à générer un export nominatif.

Chaque saison, ce club doit transmettre à sa fédération la liste de ses licenciés : nom, prénom, date de naissance, numéro de licence, parfois un certificat médical scanné. Le format d'échange est imposé par la fédération elle-même et ne fait pas l'objet de cet article ; ce qui nous intéresse ici, c'est ce qui se passe entre la génération du fichier CSV sur le serveur WordPress du club et son envoi effectif : ce fichier, une fois généré, reste souvent stocké en clair dans un dossier d'uploads, parfois pendant plusieurs semaines, le temps que quelqu'un pense à le transmettre puis à le supprimer.

## Le problème : un export généré n'est jamais éphémère en pratique

Un export CSV créé par une extension de gestion de licenciés atterrit typiquement dans `wp-content/uploads/exports/`, un dossier rarement protégé par une règle d'accès spécifique. Si ce dossier est indexable ou si son nom est devinable, le fichier devient accessible à quiconque en connaît (ou en devine) l'URL, sans authentification. Le risque n'est pas théorique : un moteur de recherche mal configuré, un lien partagé par erreur dans un email, ou simplement un accès direct suffisent à l'exposer.

## La recette : chiffrer le fichier dès sa génération

> L'essentiel à retenir : Un export généré traîne souvent plus longtemps que prévu ; Le chiffrement au repos coûte quelques lignes de code ; La clé ne doit jamais voyager avec le fichier

Plutôt que de compter sur les permissions du dossier, l'export est chiffré immédiatement après sa création, avec l'extension sodium native de PHP :

```
$cle = sodium_crypto_secretbox_keygen();
$nonce = random_bytes( SODIUM_CRYPTO_SECRETBOX_NONCEBYTES );
$contenu_chiffre = sodium_crypto_secretbox( $csv_brut, $nonce, $cle );
file_put_contents( $chemin_export, $nonce . $contenu_chiffre );
```

Trois lignes suffisent à transformer le contenu en clair en une suite d'octets illisible sans la clé. Cette clé, elle, ne doit jamais être stockée à côté du fichier chiffré : elle est conservée dans une variable d'environnement du serveur, ou communiquée une seule fois de façon séparée (par exemple via un gestionnaire de mots de passe partagé entre les deux ou trois personnes du club habilitées à faire cet export).

### Déchiffrer uniquement au moment de l'envoi

```
$donnees = file_get_contents( $chemin_export );
$nonce = mb_substr( $donnees, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, '8bit' );
$chiffre = mb_substr( $donnees, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, null, '8bit' );
$csv_clair = sodium_crypto_secretbox_open( $chiffre, $nonce, $cle );
```

Le fichier n'existe en clair que le temps strictement nécessaire à sa transmission, dans la mémoire du processus PHP, jamais sur le disque.

## Variante : chiffrer directement vers l'utilitaire d'envoi

Sur les clubs qui transmettent leurs exports via un espace de dépôt sécurisé fourni par la fédération (SFTP, portail web avec authentification), il est possible d'aller plus loin en évitant complètement l'écriture du fichier en clair sur le disque : le CSV est généré en mémoire, chiffré, puis envoyé directement, sans jamais transiter par `wp-content/uploads`.

## Ne pas oublier la suppression après transmission

Une fois l'envoi confirmé, le fichier chiffré lui-même n'a plus de raison de rester sur le serveur. Une tâche planifiée via `wp_schedule_single_event()`, déclenchée automatiquement quarante-huit heures après la génération de l'export, supprime le fichier sans intervention manuelle, évitant qu'il ne soit oublié pendant des mois dans un coin du serveur.

> Un export nominatif généré « pour être envoyé tout de suite » finit presque toujours par rester en place plus longtemps que prévu : autant partir du principe qu'il restera là, et le protéger en conséquence.

## En résumé

Chiffrer un export de licenciés avec l'extension sodium ne demande que quelques lignes de code, mais change complètement le niveau de risque en cas d'exposition accidentelle du fichier. Combiné à une suppression automatique après transmission, ce réflexe simple protège des données que le club n'a, de toute façon, pas vocation à conserver indéfiniment en clair sur son serveur web.
