Aller au contenu

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)