Rate limiting du magic link : ajouter une limite par IP #23

Closed
opened 2026-05-13 22:09:38 +00:00 by cedricAbonnel · 0 comments
Owner

Problème

Dans public/login/index.php, le rate limiting du magic link contrôle le cooldown et le plafond d'envois par email uniquement. L'adresse IP est enregistrée dans la table auth_magic_links mais n'est pas utilisée comme critère de limitation.

Un attaquant peut envoyer des requêtes vers N adresses email différentes depuis la même IP sans jamais déclencher de limite, ce qui expose le serveur mail à une utilisation abusive.

Correction

Ajouter une vérification du nombre d'envois récents par IP, indépendamment de l'email :

SELECT COUNT(*) FROM auth_magic_links
WHERE ip = :ip AND created_at >= NOW() - INTERVAL '1 hour'
  • Seuil configurable via .env (ex. MAGIC_MAX_PER_IP_HOUR, valeur par défaut : 10)
  • Retourner une erreur générique en cas de dépassement (ne pas révéler si l'email existe)

Critères d'acceptation

  • Un usage excessif depuis une même IP est bloqué
  • Le seuil par IP est configurable dans .env
  • Le message d'erreur ne révèle pas si l'email est enregistré ou non

Migré depuis varlog#34

## Problème Dans `public/login/index.php`, le rate limiting du magic link contrôle le cooldown et le plafond d'envois **par email uniquement**. L'adresse IP est enregistrée dans la table `auth_magic_links` mais n'est pas utilisée comme critère de limitation. Un attaquant peut envoyer des requêtes vers N adresses email différentes depuis la même IP sans jamais déclencher de limite, ce qui expose le serveur mail à une utilisation abusive. ## Correction Ajouter une vérification du nombre d'envois récents par IP, indépendamment de l'email : ```sql SELECT COUNT(*) FROM auth_magic_links WHERE ip = :ip AND created_at >= NOW() - INTERVAL '1 hour' ``` - Seuil configurable via `.env` (ex. `MAGIC_MAX_PER_IP_HOUR`, valeur par défaut : 10) - Retourner une erreur générique en cas de dépassement (ne pas révéler si l'email existe) ## Critères d'acceptation - [ ] Un usage excessif depuis une même IP est bloqué - [ ] Le seuil par IP est configurable dans `.env` - [ ] Le message d'erreur ne révèle pas si l'email est enregistré ou non --- *Migré depuis [varlog#34](https://git.abonnel.fr/cedricAbonnel/varlog/issues/34)*
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: cedricAbonnel/folio#23