Habilitations SQL, triggers, XSS, CSRF, vues SQL, accès site public et pseudonymisation RGPD.
Le sujet Lama Zoo est un cas très représentatif de l’épreuve SLAM : il oblige à relier le développement applicatif, la base de données, la sécurité web et le RGPD. Pour réussir, il faut éviter les réponses vagues et montrer, à chaque fois, quel risque est corrigé par la solution technique proposée.
Lama Zoo est un parc animalier qui dispose d’un système applicatif de parrainage et de gestion interne. Le sujet met en évidence plusieurs fragilités : un contrôle d’accès insuffisant, des habilitations à revoir, des affichages vulnérables aux attaques XSS, des formulaires à protéger contre les attaques CSRF, et une exposition excessive de certaines données au site public.
Le sujet ne demande pas seulement de réciter des définitions de sécurité. Il faut montrer que vous savez appliquer ces notions à un contexte précis : un parc animalier, un site de parrainage, des utilisateurs avec des rôles différents et des données qui ne doivent pas toutes être rendues publiques.
Une copie solide explique toujours le lien entre la faille et la correction. Dire “il faut utiliser esc()” est utile, mais insuffisant. Il faut ajouter que cette fonction empêche le navigateur d’interpréter une saisie utilisateur comme du code JavaScript exécutable.
| Bloc | Compétence attendue | Erreur à éviter |
|---|---|---|
| Habilitations | Mettre en place des droits par rôle et limiter les privilèges | Confondre authentification Windows et authentification applicative |
| Triggers SQL | Automatiser une règle ou une trace en base | Utiliser NEW dans un DELETE ou OLD dans un INSERT |
| XSS | Échapper les données affichées | Afficher directement une variable utilisateur |
| CSRF | Vérifier un jeton côté serveur | Croire que l’utilisateur authentifié suffit |
| Vue SQL / RGPD | Limiter les colonnes et pseudonymiser | Exposer la table complète au site public |
SELECT, INSERT, UPDATE, DELETE.La bonne réponse ne consiste pas à donner “tous les droits” pour que cela fonctionne. Le correcteur attend une logique de réduction du risque : chaque rôle doit obtenir uniquement ce dont il a besoin.
INSERT, UPDATE ou DELETE.NEW ou OLD.Dans un AFTER DELETE, la ligne supprimée n’existe plus dans NEW : il faut donc utiliser OLD. Dans un AFTER INSERT, il n’existe pas d’ancienne valeur : il faut utiliser NEW.
Une faille XSS apparaît lorsqu’une donnée saisie par un utilisateur est réaffichée sans protection. Dans CodeIgniter, la réponse attendue est d’utiliser la fonction esc() dans la vue.
<?= esc($avis['nomAnimal']) ?>
<?= esc($avis['emailVisiteur']) ?>
<?= esc($avis['commentaire']) ?>
Cette correction transforme les caractères dangereux en entités HTML. Le navigateur affiche alors le texte au lieu d’exécuter un script.
Le raisonnement attendu est le suivant : une requête envoyée par le navigateur d’un utilisateur authentifié n’est pas forcément volontaire. Il faut donc ajouter un jeton CSRF dans le formulaire et vérifier ce jeton côté serveur avant de traiter l’action.
Lama Zoo est exigeant car il mélange SQL, framework web, sécurité et RGPD. Toutefois, les notions sont très classiques : droits minimaux, échappement HTML, jeton CSRF, vue SQL et pseudonymisation. Avec une méthode claire, le sujet devient très rentable.
“Une attaque par force brute consiste à tester automatiquement de nombreuses combinaisons de mots de passe jusqu’à trouver la bonne. Le risque est renforcé si le mot de passe est court, prévisible ou noté à proximité du poste. Une politique robuste impose donc une longueur suffisante, de la complexité et une sensibilisation des utilisateurs.”
“Les rôles applicatifs permettent de limiter les droits selon les missions réelles de l’utilisateur. Un réceptionniste peut consulter certaines données sans pouvoir supprimer des informations sensibles. Cette séparation réduit les conséquences d’une erreur ou d’un compte compromis.”
“Les données saisies par un visiteur doivent être échappées avant affichage avec esc(). Ainsi, si un utilisateur saisit une balise <script>, elle sera affichée comme du texte et non exécutée par le navigateur.”
“Le formulaire doit contenir un jeton CSRF unique associé à la session. Lors de la soumission, le serveur compare le jeton reçu avec le jeton attendu. Si le jeton est absent ou invalide, la requête est refusée.”
“L’utilisateur site_public ne doit pas accéder directement à la table complète des animaux. Il faut créer une vue SQL ne contenant que les colonnes destinées à l’affichage public, puis accorder uniquement un droit SELECT sur cette vue.”
Dans un trigger DELETE, utilisez OLD. Dans un trigger INSERT, utilisez NEW. Dans un UPDATE, les deux existent, mais ils n’ont pas le même sens. Cette erreur peut faire perdre tous les points d’une question de code SQL.
Le sujet s’inscrit dans CodeIgniter. La réponse attendue est donc la fonction esc(), pas seulement “sécuriser l’affichage” ou “vérifier les données”.
La CSRF exploite justement le fait que l’utilisateur est déjà authentifié. Le serveur doit donc exiger un jeton spécifique, impossible à deviner depuis un site externe.
Le site public n’a pas besoin de toutes les colonnes de la table Animal. Accorder un droit direct sur la table complète expose des données inutiles et sensibles.
Le tableau d’honneur ne doit pas afficher nom complet, adresse et téléphone. Une pseudonymisation par initiales et ville suffit à conserver l’objectif d’affichage sans exposer inutilement les personnes.
esc(), token CSRF, vue SQL, droits limités.Une très bonne copie emploie un vocabulaire précis : moindre privilège, échappement HTML, jeton CSRF, vue SQL, pseudonymisation, traçabilité. Elle explique pourquoi chaque correction est adaptée au cas Lama Zoo, au lieu de réciter des solutions générales.
Le sujet porte sur la sécurité applicative : habilitations, triggers SQL, XSS, CSRF, vues SQL et pseudonymisation RGPD.
La fonction esc() échappe les caractères HTML dangereux et empêche l’exécution d’un script injecté par un utilisateur.
OLD désigne les anciennes valeurs, NEW désigne les nouvelles. Dans un DELETE, on utilise OLD ; dans un INSERT, on utilise NEW.
Il faut créer une vue SQL qui ne contient que les colonnes nécessaires à l’affichage public, puis accorder un droit SELECT à l’utilisateur site_public.
La pseudonymisation réduit l’exposition des données personnelles tout en permettant de conserver un affichage public lisible, par exemple avec des initiales et la ville.
Sujet complet BTS SIO 2023 SLAM Lama Zoo pour travailler l’épreuve.
📄 Sujet complet PDFRetrouvez les autres sujets BTS SIO disponibles pour compléter vos révisions.