Plateforme de Capture The Flag (CTF) destinée aux étudiants et formateurs en cybersécurité. Les étudiants résolvent des challenges en soumettant des flags, les formateurs créent les épreuves et suivent les performances en temps réel.
- Catalogue de challenges classés par catégorie, difficulté et points
- Soumission de flags avec validation côté serveur
- Scoring dégressif : le 1er à résoudre obtient les points pleins, chaque résolution suivante vaut 1 point de moins (aucun plancher)
- Classement temps réel mettant en évidence l'utilisateur connecté
- Espace formateur / admin : création de challenges, suivi des performances, gestion des comptes étudiants
- Authentification sécurisée (inscriptions publiques désactivées — comptes créés par un formateur/admin)
- Sécurité : RLS strict sur toutes les tables, calcul de score via RPC
SECURITY DEFINERcôté serveur uniquement
- Frontend : React 18, Vite 5, TypeScript, Tailwind CSS, shadcn/ui
- Backend : Lovable Cloud (Supabase managé en EMEA) — Postgres, Auth, Edge Functions
- Design : esthétique cyberpunk (bleu électrique, fond sombre, accents violets, JetBrains Mono)
src/
├── pages/ # Auth, Challenges, Leaderboard, Manage, Index
├── components/ # Navbar, NavLink, ui/ (shadcn)
├── hooks/ # useAuth, use-toast, use-mobile
├── integrations/
│ └── supabase/ # client + types (auto-générés)
└── index.css # tokens de design (HSL)
supabase/
├── migrations/ # schéma + RLS + fonctions SQL
└── functions/
├── create-student/ # création d'un compte étudiant (admin/formateur)
└── reset-users/ # réinitialisation des comptes
profiles— infos publiques (nom, email)user_roles— rôlesadmin/formateur/etudiant(table séparée pour éviter l'escalade de privilèges)ctf_challenges— titre, description, flag, points, catégorie, difficultésubmissions— historique des tentatives (correctes ou non)
- RLS activée sur toutes les tables
- Fonction
has_role()enSECURITY DEFINERpour éviter la récursion RLS - Fonction
get_user_score()côté serveur : empêche la manipulation des scores par le client EXECUTErévoqué pouranonsur toutes les fonctions sensibles
- Node.js 18+ (recommandé : 20+)
- npm, bun ou pnpm
- Un projet Lovable Cloud (ou Supabase) avec les migrations appliquées
-
Cloner et installer
git clone https://github.com/K3lgy/CYBERCTF cd cyberctf npm install -
Configurer les variables d'environnement
Créer un fichier
.envà la racine :VITE_SUPABASE_URL=https://<votre-projet>.supabase.co VITE_SUPABASE_PUBLISHABLE_KEY=<votre-clé-anon> VITE_SUPABASE_PROJECT_ID=<id-du-projet>
Sur Lovable Cloud, ce fichier est généré automatiquement.
-
Appliquer les migrations
Les migrations SQL se trouvent dans
supabase/migrations/. Sur Lovable Cloud elles sont appliquées automatiquement. En local avec la CLI Supabase :supabase link --project-ref <ref> supabase db push
-
Déployer les Edge Functions (optionnel pour le dev local)
supabase functions deploy create-student supabase functions deploy reset-users
Sur Lovable Cloud le déploiement est automatique.
-
Lancer le serveur de dev
npm run dev
L'application est disponible sur
http://localhost:8080.
- Admin :
admin@kapelgy.com/K@p3lgy!Adm1n#2026$Secure - Étudiants : créés depuis l'espace admin/formateur (les inscriptions publiques sont volontairement désactivées)
| Commande | Description |
|---|---|
npm run dev |
Démarre le serveur de développement Vite |
npm run build |
Build de production |
npm run preview |
Aperçu du build de production |
npm run lint |
Vérification ESLint |
npx vitest run |
Exécute la suite de tests |
Le projet est déployé en continu via Lovable :
- Production : https://ctf-buddy-lab.lovable.app
- Node.js 18+ (recommandé : 20+)
- npm, bun ou pnpm
- Un projet Lovable Cloud (ou Supabase) avec les migrations appliquées
Pour simplifier l’installation du projet, vous pouvez utiliser un script start.sh qui automatise le clonage et l’installation des dépendances.
#!/bin/bash
set -e
echo "🚀 Clonage du projet CyberCTF..."
# Remplacer par l'URL réelle du repo si nécessaire
git clone <url-du-repo> cyberctf
cd cyberctf
echo "📦 Installation des dépendances..."
npm install
echo "⚙️ Configuration de l'environnement..."
if [ ! -f .env ]; then
cp .env.example .env 2>/dev/null || echo "Aucun .env.example trouvé, créez le fichier .env manuellement."
fi
echo "✅ Installation terminée !"
echo "👉 Lancez le projet avec : npm run dev"chmod +x start.sh./start.sh-
Cloner et installer
git clone <url-du-repo> cd cyberctf npm install
-
Configurer les variables d'environnement
Créer un fichier
.envà la racine :VITE_SUPABASE_URL=https://<votre-projet>.supabase.co VITE_SUPABASE_PUBLISHABLE_KEY=<votre-clé-anon> VITE_SUPABASE_PROJECT_ID=<id-du-projet>
Sur Lovable Cloud, ce fichier est généré automatiquement.
-
Appliquer les migrations
supabase link --project-ref <ref> supabase db push
-
Déployer les Edge Functions (optionnel)
supabase functions deploy create-student supabase functions deploy reset-users
-
Lancer le serveur de dev
npm run dev
L'application est disponible sur
http://localhost:8080.
Projet : K3LGY Cybersécurité Auteur : K3LGY (ou nom à compléter) Type : Licence propriétaire – usage strictement limité
Tous les droits relatifs au présent projet, incluant le code source, la documentation, les ressources pédagogiques et tout contenu associé, sont réservés à son auteur.
Ce projet est protégé par le droit d’auteur. Toute reproduction, modification, distribution ou utilisation sans autorisation explicite est interdite.
Ce projet est fourni uniquement à des fins pédagogiques et de démonstration.
Vous êtes autorisé à :
- Consulter le code pour un usage personnel ou éducatif
- Utiliser le projet dans un cadre d’apprentissage non commercial
Sans autorisation écrite préalable de l’auteur, il est strictement interdit de :
- Copier, modifier ou redistribuer le projet
- Utiliser le projet à des fins commerciales
- Intégrer tout ou partie du projet dans un autre logiciel ou service
- Publier une version dérivée (fork, clone ou reupload public)
Le projet reste la propriété exclusive de son auteur. Aucun droit de propriété n’est transféré à l’utilisateur.
Ce projet est fourni "en l’état", sans garantie d’aucune sorte. L’auteur ne peut être tenu responsable des dommages directs ou indirects liés à son utilisation.
Toute utilisation non couverte par cette licence doit faire l’objet d’une demande d’autorisation écrite auprès de l’auteur.


