TypeScript 98.3%
CSS 0.9%
Shell 0.7%
1# Sécurité — guide opérationnel23Le modèle de sécurité complet (menaces, décisions, défenses) est dans **`security-model.md`**.4Ce document résume l'opérationnel.56## Liste de contrôle de mise en production78- [ ] `AUTH_SECRET` unique généré (`openssl rand -hex 32`)9- [ ] `OPENROUTER_API_KEY` présente uniquement dans `.env` serveur (gitignoré)10- [ ] `APP_URL=https://…` (active cookies `Secure` + vérification d'origine)11- [ ] Compte `admin` initial : mot de passe changé, compte personnel créé, puis12 `DISABLE_INITIAL_ADMIN=true` et compte d'amorçage désactivé13- [ ] `SIGNUP_ACCESS_CODE` défini (inscription réservée aux étudiants du cours)14- [ ] Budgets ajustés (Admin → Paramètres)15- [ ] Sauvegardes planifiées (`scripts/backup.sh` en cron)16- [ ] HTTPS (ngrok domaine réservé ou reverse-proxy TLS)1718## Rappels clés1920- Mots de passe : bcrypt coût 12 ; `admin123` refusé comme mot de passe permanent ; 10 caractères min.21- Sessions : jeton 256 bits, **haché en base**, httpOnly, SameSite=Lax, 14 jours, révocables.22- Anti-bruteforce : 8 échecs / 15 min / (IP+identifiant) + journal `auth_events`.23- CSRF : vérification `Sec-Fetch-Site`/`Origin` sur toutes les mutations.24- XSS : Markdown rendu sans HTML brut ; en-têtes CSP/nosniff/DENY.25- Isolation : espaces de connaissances filtrés en SQL sur chaque requête RAG et chaque accès26 citation ; matériel d'examen dans `instructor-private`, jamais servi aux étudiants.27- Injection de prompt : contenus récupérés et fichiers étudiants encadrés comme **données** ; le28 serveur ne fournit au modèle que des fragments auxquels l'utilisateur a déjà droit ; citations29 hors contexte neutralisées.30- Vie privée : agrégats professeur ≥ 3 étudiants ; conversations étudiantes non consultables31 (sauf message signalé par l'étudiant).32- Secrets : jamais journalisés ; messages d'erreur client génériques.33