Problème : Les clés Firebase étaient en dur dans firebase-messaging-sw.js
Solution : Génération dynamique au build depuis les variables d'environnement
Problème : Aucune protection sur la base de données Firestore
Solution : Implémentation de firestore.rules avec validation stricte
- Chaque utilisateur ne peut lire/écrire que ses propres données
- Validation des montants (min/max)
- Validation des formats (email, longueur des chaînes)
- Validation des dates
Problème : Tokens Firebase, IDs utilisateurs, erreurs complètes exposés
Solution : Implémentation d'un logger sanitisé src/lib/logger.ts
- Les logs sensibles sont filtrés en production
- Seuls les messages génériques sont exposés au client
- Détails complets en développement seulement
Problème : Pas de validation des montants, formats, longueurs
Solution :
- src/lib/validation.ts - Fonctions de validation réutilisables
- src/app/api/validate/transaction/route.ts - Validation serveur
- Validation côté client dans les composants
- Contraintes strictes :
AMOUNT_MIN: 0.01,AMOUNT_MAX: 1000000, etc.
Problème : strict: false permet les erreurs de type
Solution : Activation de strict: true dans tsconfig.json
Problème : Pas de protection contre XSS, clickjacking, etc.
Solution : Ajout dans next.config.ts :
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=()
Strict-Transport-Security: max-age=31536000
| Fichier | Rôle |
|---|---|
| firestore.rules | Règles de sécurité Firestore |
| src/lib/validation.ts | Validateurs réutilisables |
| src/lib/logger.ts | Logger sanitisé |
| src/app/api/validate/transaction/route.ts | Validation serveur |
| Fichier | Changements |
|---|---|
| tsconfig.json | strict: true |
| next.config.ts | Headers de sécurité HTTP |
| src/app/(auth)/login/page.tsx | Validation entrées, logs sanitisés |
| src/app/api/notifications/trigger/route.ts | Logs sanitisés |
| src/components/dashboard/TransactionModal.tsx | Validation contraintes |
| src/context/AuthContext.tsx | Logs sanitisés |
- ✅ Utilisez toujours des variables d'env pour les clés sensibles
- ✅ Commettez
.env.example(avec valeurs vides) - ❌ Ne commitez JAMAIS
.env.localou d'autres fichiers.env
- ✅ Utilisez
loggerde src/lib/logger.ts - ✅ Les logs sensibles sont filtrés en production
- ❌ N'appelez pas directement
console.error()avec des erreurs Firebase
- ✅ Validez côté client avec src/lib/validation.ts
- ✅ Validez côté serveur avant d'écrire en base
- ✅ Respectez les contraintes
VALIDATION_CONSTRAINTS
- ✅ Retournez des messages génériques au client
- ✅ Loggez les détails complets serveur-side
- ❌ N'exposez jamais les détails d'erreur techniques au client
- ✅ Toujours définir des règles explicites
- ✅ Vérifier l'authentification et l'ownership
- ✅ Valider les types et les contraintes
- ❌ Ne jamais utiliser
allow read, write: if true;
-
Configurez les variables d'environnement :
NEXT_PUBLIC_FIREBASE_*(publiques)FIREBASE_PROJECT_ID,FIREBASE_CLIENT_EMAIL,FIREBASE_PRIVATE_KEY(sensibles)CRON_SECRET(très sensible)
-
Déployez les Firestore Rules :
firebase deploy --only firestore:rules
-
Vérifiez les headers de sécurité en production :
curl -I https://your-domain.com | grep -i "X-Content-Type-Options"
# Vérifier qu'aucun fichier sensible n'est commité
git status
# Valider la syntaxe TypeScript
npm run build
# Tester les règles Firestore localement
firebase emulators:startSi une clé est exposée :
-
Révoquez la clé immédiatement
- Console Firebase pour les clés API
- Firebase Auth pour les mots de passe
- Système d'admin pour
CRON_SECRET
-
Générez une nouvelle clé
-
Mettez à jour les variables d'environnement en production
-
Redéployez : Les nouvelles clés seront utilisées au prochain build
- Firestore Rules déployées
- Variables d'env configurées en production
- Aucun fichier
.env*commité - TypeScript strict validé
- Headers de sécurité présents
- Logs sanitisés en production
- Validations côté client implémentées
- Validations côté serveur implémentées