Référence des API — PerfShop
Ce document liste l'ensemble des endpoints REST exposés par le backend Spring Boot de PerfShop.
Base URL (prod) : https://perfshop-api.perfshop.io
Base URL (local) : http://localhost:9080
Conventions
| Symbole |
Signification |
| 🔓 |
Public — aucune authentification requise |
| 🔑 |
Session utilisateur requise (LOGGED_IN_USER en session) |
| 🔐 |
Admin requis — session cookie ou header X-Admin-Token |
| 👑 |
SuperAdmin uniquement |
| 🚨 |
Endpoint intentionnellement vulnérable (chaos sécurité) — actif selon le niveau |
L'authentification admin accepte deux chemins :
- Cookie de session : après
POST /api/admin/login
- Header
X-Admin-Token: <uuid> : token généré au login, utilisable cross-origin
Authentification utilisateur — /api/auth
| Méthode |
Endpoint |
Auth |
Description |
POST |
/api/auth/login |
🔓 |
Connexion utilisateur. Retourne securityToken, id, email, prénom/nom. En niveau 3+, ajoute le header X-Debug-Token (faille S7). |
POST |
/api/auth/logout |
🔑 |
Déconnexion. En chaos niveau 3 (A11), la session reste exploitable pendant la grace period. |
GET |
/api/auth/status |
🔓 |
Statut de la session en cours (authenticated, hasToken, userId, graceActive). |
GET |
/api/auth/me |
🔑 |
Profil complet de l'utilisateur connecté. En niveau 1+, inclut le hash BCrypt du mot de passe (faille S3). |
PUT |
/api/auth/me |
🔑 |
Mise à jour du profil (civility, firstName, lastName, birthDate, phone, street, postalCode, city, region, country). En niveau 3+, les champs email et password du body sont appliqués sans whitelist (faille S9). |
Corps — POST /api/auth/login
{ "email": "user@example.com", "password": "monMotDePasse" }
Corps — PUT /api/auth/me
{
"civility": "M",
"firstName": "Jean",
"lastName": "Dupont",
"birthDate": "1990-05-15",
"phone": "+33612345678",
"street": "12 rue de la Paix",
"postalCode": "75001",
"city": "Paris",
"region": "Île-de-France",
"country": "FR"
}
Catalogue produits — /api/products
| Méthode |
Endpoint |
Auth |
Description |
GET |
/api/products |
🔓 |
Liste paginée des produits. Paramètres : page, size, sort (id, name, price, category, createdAt, stock). |
GET |
/api/products/{id} |
🔓 |
Détail d'un produit par ID. |
GET |
/api/products/search |
🔓 |
Recherche produits. Paramètres : q, category, minPrice, maxPrice, page, size. En niveau 1+, utilise une requête native non paramétrée (faille S1). |
GET |
/api/products/categories |
🔓 |
Liste de toutes les catégories disponibles. |
Panier — /api/cart
Le panier est libre : accessible connecté ou non connecté (guest).
| Méthode |
Endpoint |
Auth |
Description |
GET |
/api/cart |
🔓 |
Contenu du panier courant (items, total, itemCount). |
POST |
/api/cart/add |
🔓 |
Ajoute un article au panier. Body : { "productId": 1, "quantity": 2 }. |
PUT |
/api/cart/item/{id} |
🔓 |
Met à jour la quantité d'un article. Paramètre : ?quantity=N. |
DELETE |
/api/cart/item/{id} |
🔓 |
Supprime un article du panier. |
DELETE |
/api/cart |
🔓 |
Vide entièrement le panier. |
Checkout — /api/checkout
Parcours en 4 étapes. Les étapes 1–3 sont gérées ici ; l'étape 4 (validation finale) est dans /api/orders.
Selon le niveau Chaos Scripting (0–4), des headers supplémentaires sont requis à chaque étape (X-Session-Token, X-Request-ID, X-Action-Token, X-CSRF-Token, X-Step-Token, X-Signature).
| Méthode |
Endpoint |
Auth |
Description |
GET |
/api/checkout/session |
🔑 |
Résumé de la session checkout en cours (adresse, livraison, paiement). |
GET |
/api/orders/checkout/verify |
🔑 |
Vérifie que l'accès au checkout est autorisé (canCheckout, authenticated, hasToken). |
POST |
/api/checkout/address |
🔑 |
Étape 1 — Adresse de livraison. Body : street, postalCode, city, region?, country, phone. |
POST |
/api/checkout/shipping |
🔑 |
Étape 2 — Mode de livraison. Body : { "shippingMethod": "standard" \| "express" \| "premium" }. |
POST |
/api/checkout/payment |
🔑 |
Étape 3 — Paiement. Body : cardHolder, cardNumber, expiryMonth, expiryYear, cvv. Le CVV n'est jamais stocké ni logué. |
POST |
/api/checkout/promo |
🔑 |
Validation d'un code promo. Body : { "code": "PROMO10" }. En niveau 2+ (A6), un code invalide est accepté avec 0% de réduction. |
Commandes — /api/orders
| Méthode |
Endpoint |
Auth |
Description |
GET |
/api/orders |
🔑 |
Liste des commandes de l'utilisateur connecté + historyTotal. |
POST |
/api/orders |
🔑 |
Étape 4 — Validation finale de la commande. Body : items, securityToken, et optionnellement shippingAddress, shippingMethod, paymentMethod. En niveau 2+, accepte unitPrice depuis le body (faille S5) et stocke l'adresse sans sanitisation (faille S4). |
GET |
/api/orders/{id} |
🔑 |
Détail d'une commande. En niveau 1+, la vérification d'appartenance est désactivée (faille S2 — IDOR). |
GET |
/api/orders/{id}/details |
🔑 |
Détail complet avec les articles (noms, quantités, prix). Même logique IDOR (S2) qu'au-dessus. |
GET |
/api/orders/{id}/invoice |
🔑 |
Facture simulée. Paramètre : ?format=pdf\|csv. En niveau 3+, le paramètre format n'est pas validé (faille S8 — Path Traversal). |
POST |
/api/orders/{id}/cancel |
🔑 |
Annule une commande en statut PENDING ou CONFIRMED. |
Corps — POST /api/orders
{
"securityToken": "uuid-token",
"items": [
{ "productId": 1, "quantity": 2, "unitPrice": 9.99 }
]
}
Pays — /api/countries
| Méthode |
Endpoint |
Auth |
Description |
GET |
/api/countries |
🔓 |
Liste des pays supportés pour les formulaires, triée avec FR en premier. Retourne [{ "code": "FR", "label": "France" }, ...]. |
Administration — /api/admin
Auth : session cookie ou header X-Admin-Token.
Auth admin
| Méthode |
Endpoint |
Auth |
Description |
POST |
/api/admin/login |
🔓 |
Connexion admin (table admin_users, BCrypt). Retourne adminToken, email, isSuperAdmin, canAccessChaos, canAccessMonitoring, canAccessAdmin. |
POST |
/api/admin/logout |
🔐 |
Déconnexion admin (invalide session + token). |
GET |
/api/admin/status |
🔓 |
Statut d'authentification admin (authenticated). |
Gestion des comptes admin
| Méthode |
Endpoint |
Auth |
Description |
GET |
/api/admin/accounts |
👑 |
Liste tous les comptes admin (sans passwordHash). Réservé au superAdmin. |
POST |
/api/admin/accounts |
👑 |
Crée un compte admin. Body : email, password, canAccessChaos, canAccessMonitoring, canAccessAdmin. |
DELETE |
/api/admin/accounts/{id} |
👑 |
Supprime un compte admin (interdit sur le superAdmin). |
PUT |
/api/admin/accounts/{id}/password |
👑 |
Change le mot de passe d'un compte. Body : { "password": "newPass" }. |
PUT |
/api/admin/accounts/{id}/rights |
👑 |
Modifie les droits d'un compte. Body : canAccessChaos, canAccessMonitoring, canAccessAdmin. |
Gestion des utilisateurs
| Méthode |
Endpoint |
Auth |
Description |
GET |
/api/admin/users |
🔐 |
Liste tous les utilisateurs avec leur nombre de commandes. |
POST |
/api/admin/users |
🔐 |
Crée un utilisateur. Body : { "email": "...", "password": "..." }. |
DELETE |
/api/admin/users/{id} |
🔐 |
Supprime un utilisateur et toutes ses commandes. |
Gestion des commandes
| Méthode |
Endpoint |
Auth |
Description |
GET |
/api/admin/orders |
🔐 |
Liste toutes les commandes (tous utilisateurs confondus). |
DELETE |
/api/admin/orders/{id} |
🔐 |
Supprime une commande. |
Gestion des produits
| Méthode |
Endpoint |
Auth |
Description |
GET |
/api/admin/products |
🔐 |
Liste tous les produits (triés par catégorie puis nom). |
POST |
/api/admin/products |
🔐 |
Crée un produit. Body : name, description, price, stock, category, imageUrl. |
PUT |
/api/admin/products/{id} |
🔐 |
Met à jour un produit (champs partiels acceptés). |
DELETE |
/api/admin/products/{id} |
🔐 |
Supprime un produit. |
POST |
/api/admin/products/{id}/image |
🔐 |
Upload une image produit (multipart/form-data, champ file). Formats : jpg, png, webp, gif. |
Chaos Backend — /api/admin/chaos
Tous ces endpoints nécessitent l'auth admin.
| Méthode |
Endpoint |
Auth |
Description |
GET |
/api/admin/chaos/status |
🔐 |
Statut complet backend + frontend ({ backend: {...}, frontend: {...} }). |
POST |
/api/admin/chaos/reset |
🔐 |
Remet tous les chaos à 0 (backend, frontend, scripting, métier, sécurité, fonctionnel). |
POST |
/api/admin/chaos/memory |
🔐 |
Fuite mémoire. Body : { "intensity": 0-100, "heapCap": 80 }. |
POST |
/api/admin/chaos/db-pool |
🔐 |
Saturation pool DB. Body : { "intensity": 0-100 }. |
POST |
/api/admin/chaos/thread-pool |
🔐 |
Saturation pool threads. Body : { "intensity": 0-100 }. |
POST |
/api/admin/chaos/cpu |
🔐 |
Charge CPU. Body : { "intensity": 0-100, "ratio": 4.0 }. |
POST |
/api/admin/chaos/slow-queries |
🔐 |
Ralentissement requêtes SQL. Body : { "intensity": 0-100 }. |
POST |
/api/admin/chaos/deadlock |
🔐 |
Probabilité de deadlock. Body : { "intensity": 0-100 }. |
POST |
/api/admin/chaos/network |
🔐 |
Timeout réseau simulé. Body : { "intensity": 0-100 }. |
Chaos Frontend — /api/chaos/frontend
| Méthode |
Endpoint |
Auth |
Description |
GET |
/api/chaos/frontend/state |
🔓 |
État courant du chaos frontend (cpuBurn, memoryLeak, domFlood, fetchFlood). Pollé toutes les 5s par le frontend React. |
POST |
/api/chaos/frontend/state |
🔐 |
Modifie les intensités frontend. Body : { "cpuBurn": 50, "domFlood": 30, ... }. |
Chaos Sécurité — /api/admin/chaos/security et /api/chaos/public/security
| Méthode |
Endpoint |
Auth |
Description |
POST |
/api/admin/chaos/security |
🔐 |
Définit le niveau de sécurité. Body : { "level": 0-4 }. 0=Désactivé, 1=Junior, 2=Confirmé, 3=Expert, 4=Master. |
GET |
/api/admin/chaos/security/status |
🔐 |
Statut détaillé + compteurs par faille (S1…S12). |
POST |
/api/admin/chaos/security/reset |
🔐 |
Remet le niveau à 0 et efface les compteurs. |
POST |
/api/admin/chaos/security/logs/clear |
🔐 |
Efface le log d'activité sécurité. |
GET |
/api/chaos/public/security/status |
🔓 |
Statut + compteurs (lecture seule, pour le monitoring). |
GET |
/api/chaos/public/security/logs |
🔓 |
Flux de logs d'activité sécurité (pour le monitoring). |
GET |
/api/chaos/public/security/faults |
🔓 |
Catalogue pédagogique des failles pour un niveau. Paramètre : ?level=N. |
Chaos Métier — /api/admin/chaos/business et /api/chaos/public/business
| Méthode |
Endpoint |
Auth |
Description |
POST |
/api/admin/chaos/business |
🔐 |
Définit le niveau métier. Body : { "level": 0-3 }. 0=Désactivé, 1=Junior, 2=Confirmé, 3=Expert. |
GET |
/api/admin/chaos/business/status |
🔐 |
Statut + compteurs par anomalie (A1…A11). |
POST |
/api/admin/chaos/business/reset |
🔐 |
Remet le niveau à 0 et efface les compteurs. |
POST |
/api/admin/chaos/business/logs/clear |
🔐 |
Efface le log d'activité métier. |
GET |
/api/chaos/public/business/status |
🔓 |
Statut + compteurs (lecture seule). |
GET |
/api/chaos/public/business/logs |
🔓 |
Flux de logs d'activité métier. |
GET |
/api/chaos/public/business/anomalies |
🔓 |
Catalogue pédagogique des anomalies pour un niveau. Paramètre : ?level=N. |
Chaos Fonctionnel — /api/admin/chaos/functional et /api/chaos/public/functional
| Méthode |
Endpoint |
Auth |
Description |
POST |
/api/admin/chaos/functional |
🔐 |
Définit le niveau fonctionnel. Body : { "level": 0-3 }. |
GET |
/api/admin/chaos/functional/status |
🔐 |
Statut + compteurs par anomalie. |
POST |
/api/admin/chaos/functional/reset |
🔐 |
Remet le niveau à 0. |
POST |
/api/admin/chaos/functional/logs/clear |
🔐 |
Efface le log fonctionnel. |
GET |
/api/chaos/public/functional/status |
🔓 |
Statut (lecture seule). |
GET |
/api/chaos/public/functional/logs |
🔓 |
Flux de logs fonctionnel. |
GET |
/api/chaos/public/functional/anomalies |
🔓 |
Catalogue pédagogique. Paramètre : ?level=N. |
Chaos Scripting — /api/admin/chaos/scripting
| Méthode |
Endpoint |
Auth |
Description |
POST |
/api/admin/chaos/scripting |
🔐 |
Définit le niveau scripting. Body : { "level": 0-4 }. |
GET |
/api/admin/chaos/scripting/status |
🔐 |
Statut + bundles actifs. |
POST |
/api/admin/chaos/scripting/reset |
🔐 |
Efface tous les bundles et remet le niveau à 0. |
GET |
/api/admin/chaos/scripting/logs |
🔐 |
Log d'activité scripting (admin). |
DELETE |
/api/admin/chaos/scripting/logs |
🔐 |
Efface les logs scripting. |
GET |
/api/admin/chaos/scripting/public/status |
🔓 |
Statut (lecture seule, pour le monitoring). |
GET |
/api/admin/chaos/scripting/public/logs |
🔓 |
Flux de logs scripting (monitoring). |
Chaos Status public global — /api/chaos/public
| Méthode |
Endpoint |
Auth |
Description |
GET |
/api/admin/chaos/public/status |
🔓 |
Statut consolidé backend + frontend + métier + fonctionnel. Utilisé par le monitoring sans session. |
Portail admin caché (Chaos Sécurité niveau 4 — Master) — /api/admin/portal
Endpoints intentionnellement vulnérables
Ces endpoints sont uniquement actifs lorsque le niveau Chaos Sécurité est égal à 4 (Master).
En dessous du niveau 4, tous ces endpoints retournent 404 sans corps.
| Méthode |
Endpoint |
Auth |
Faille |
Description |
GET |
/api/admin/portal/stats |
🔓 🚨 |
S10 |
Expose sans auth : userCount, orderCount, productCount, adminContact (email du superAdmin). |
POST |
/api/admin/portal/login |
🔓 🚨 |
S11 |
Login par SQLi — requête native concaténée. Payload : admin' OR '1'='1' --. Génère un adminToken valide si bypass réussi. |
PUT |
/api/admin/portal/accounts/{id}/promote |
X-Admin-Token 🚨 |
S12 |
Promeut un compte en superAdmin sans vérifier si le requérant est déjà superAdmin. |
GET |
/api/admin/portal/accounts |
X-Admin-Token (superAdmin requis en DB) 🚨 |
S12 |
Liste tous les comptes admin avec passwordHash exposé. Retourne 403 avec hint pédagogique si non superAdmin. |
Scénario d'exploitation chaîné (niveau Master)
1. Fuzzing → découvre /admin (page React)
2. GET /api/admin/portal/stats [S10] → récupère l'email du superAdmin
3. POST /api/admin/portal/login [S11] → SQLi bypass → obtient adminToken
4. Accès chaos-admin et monitoring via X-Admin-Token
5. PUT /api/admin/portal/accounts/1/promote [S12] → s'auto-promeut superAdmin
6. GET /api/admin/portal/accounts [S12] → liste comptes + passwordHash
Récapitulatif des failles de sécurité par endpoint
| Faille |
Endpoint |
Niveau d'activation |
| S1 SQLi recherche |
GET /api/products/search?q= |
≥ 1 (Junior) |
| S2 IDOR commandes |
GET /api/orders/{id}, GET /api/orders/{id}/details |
≥ 1 (Junior) |
| S3 Hash exposé |
GET /api/auth/me |
≥ 1 (Junior) |
| S4 XSS stocké |
POST /api/orders (champ shippingAddress) |
≥ 2 (Confirmé) |
| S5 Prix falsifié |
POST /api/orders (champ unitPrice) |
≥ 2 (Confirmé) |
| S6 Timing attack |
POST /api/auth/login |
≥ 2 (Confirmé) |
| S7 Token HMAC faible |
POST /api/auth/login → header X-Debug-Token |
≥ 3 (Expert) |
| S8 Path Traversal |
GET /api/orders/{id}/invoice?format= |
≥ 3 (Expert) |
| S9 Mass Assignment |
PUT /api/auth/me (champs email, password) |
≥ 3 (Expert) |
| S10 Stats sans auth |
GET /api/admin/portal/stats |
= 4 (Master) |
| S11 SQLi portail |
POST /api/admin/portal/login |
= 4 (Master) |
| S12 IDOR privesc |
PUT /api/admin/portal/accounts/{id}/promote, GET /api/admin/portal/accounts |
= 4 (Master) |