Aller au contenu
M08 · B. Assurer la confidentialité des données

Protéger les données des utilisateurs dans l'application

Les règles concrètes de protection des données utilisateurs dans le code - ne renvoyer que les champs utiles, masquer, pseudonymiser, ne jamais journaliser de secrets, limiter la conservation - et ce que l'obfuscation du code source protège... ou ne protège pas.

1Situer

La loi dit quoi protéger ; le code dit comment. Une API qui renvoie un SELECT * entier, un fichier journal qui garde les mots de passe tapés, un numéro de téléphone affiché en clair sur un bon de livraison : ce sont les fuites les plus fréquentes, et elles se corrigent en quelques lignes.

2Comprendre

Ne renvoyer que ce qui est nécessaire
Base (serveur) nom : Amina Benali tel : 0612345678 cin : AB123456 mdp : $2y$10$61UR… Réponse JSON nom : Amina Benali tel : 0612345678 cin : AB123456 mdp : $2y$10$61UR… cin et mdp : jamais envoyés tout est stocké, rien n'est encore envoyé

Dans la base, la ligne d'une cliente contient tout : nom, téléphone, CIN, hachage du mot de passe.

1 / 4

Les règles de protection dans le code

Les règles qui reviennent dans tous les projets :

  1. Minimiser : ne collecter et ne stocker que ce qui sert (leçon B.1).
  2. Ne renvoyer que les champs utiles : listes de colonnes explicites, objets de réponse construits à la main.
  3. Masquer à l’affichage : 06******78, **** 4821.
  4. Pseudonymiser pour les statistiques et les tests : remplacer les noms par des identifiants.
  5. Protéger les secrets : mots de passe hachés, données sensibles chiffrées (leçon B.4), clés hors du code.
  6. Ne jamais journaliser de secrets.
  7. Limiter la conservation : purges et anonymisation automatiques.
  8. Copies de travail : jamais la vraie base clients sur le PC d’un développeur ou dans un environnement de test.

L’obfuscation du code source

// avant
function prixTTC(prix) { return prix * 1.2; }
// après obfuscation (exemple)
var _0x1a=function(_0x2b){return _0x2b*0x6/0x5;};

L’obfuscation protège un peu la propriété intellectuelle (rendre la copie d’un algorithme plus coûteuse). Elle ne protège pas un secret : le navigateur doit exécuter le code, donc on peut toujours l’observer, le dérouler et lire ce qu’il envoie dans l’onglet Réseau.

Exemple simple

Le bon de livraison

Le livreur a besoin du nom, de l'adresse et d'un numéro pour appeler. Il n'a pas besoin du numéro de CIN ni de l'historique des achats. On imprime seulement ce qui lui sert.

Exemple simple

Le ticket de carte bancaire

Sur le ticket de caisse, le numéro de carte apparaît sous la forme **** **** **** 4821 : assez pour que le client reconnaisse sa carte, trop peu pour qu'un voleur s'en serve. C'est le masquage.

3Manipuler

L'API du compte client renvoie trop d'informations et la page de connexion garde les mots de passe dans son journal. Corrigez les deux (compte d'essai : amina.benali@mail.ma / Atlas2025).
Pas à pas dans le lab ↗ Cliquez sur Exécuter : PHP 8.3 démarre dans votre navigateur (environ 5 Mo à télécharger, une seule fois).

La page s'affichera ici.

Le navigateur demandera /api/client.php?id=1 au serveur, qui exécutera le PHP et renverra du HTML.

Entre le navigateur et le serveur aucun échange pour l'instant

Consignes 0 / 3

  1. L'API ne renvoie plus le hachage du mot de passe ni la CIN
  2. Le téléphone est masqué : 06******78
  3. Le journal garde l'e-mail et le résultat, jamais le mot de passe

4Pratiquer

Exercice 1 · Masquer un e-mail

Écrivez masquerEmail('amina.benali@mail.ma') qui renvoie 'a***********@mail.ma' (première lettre, des étoiles, puis le domaine).

Voir le corrigé
<?php
function masquerEmail(string $email): string
{
    [$nom, $domaine] = explode('@', $email, 2) + [1 => ''];
    return mb_substr($nom, 0, 1) . str_repeat('*', max(mb_strlen($nom) - 1, 0)) . '@' . $domaine;
}
echo masquerEmail('amina.benali@mail.ma');   // a***********@mail.ma

Exercice 2 · Purger les vieux comptes

Les comptes sans aucune commande depuis 3 ans doivent être anonymisés (prénom « Ancien », nom « client », e-mail et téléphone vidés). Écrivez la requête SQL.

Voir le corrigé
UPDATE clients
SET prenom = 'Ancien', nom = 'client', email = NULL
WHERE date_inscription < CURDATE() - INTERVAL 3 YEAR
  AND id NOT IN (
    SELECT client_id FROM commandes
    WHERE date_commande >= CURDATE() - INTERVAL 3 YEAR
  );

5Vérifier

1. Pourquoi éviter SELECT * dans une API ?
2. L'obfuscation du code JavaScript permet-elle de cacher une clé secrète dans le navigateur ?
3. Que faut-il ne jamais écrire dans un fichier journal ?