Limitation des requêtes
Cette page décrit les limites réellement actives contre les abus : force brute sur la connexion, envois massifs de liens, coût de l'assistant.
Ce qui est actif
| Protection | Limite | Clé | Où |
|---|---|---|---|
| Verrouillage de compte | 5 échecs de connexion, puis compte verrouillé 30 minutes | compte | LoginSecurityService |
| Lien magique de connexion | 3 demandes par tranche de 5 minutes | compte | MagicLinkService ; réponse 429 |
| Assistant Bemba (application) | 40 questions par tranche glissante de 10 minutes | utilisateur | limiteur assistant ; réponse 429 |
| Assistant du site public | 20 questions par tranche de 10 minutes, et 500 par jour au total | adresse IP, puis global | limiteurs assistant_public et assistant_public_global |
Les compteurs des limiteurs sont stockés dans le cache applicatif : Redis en production, le système de fichiers ailleurs. Les tentatives de connexion sont enregistrées en base (adresse IP, navigateur, motif d'échec) et une connexion depuis une adresse jamais vue est signalée.
Configuration : backend/config/packages/rate_limiter.yaml.
Ce qui n'est pas actif
Le fichier de configuration déclare aussi, pour la production, des limiteurs par adresse IP sur l'ensemble de l'API (login, authentication, api_global, api_write, password_reset, export). Le code qui les applique, RateLimitingSubscriber, est exclu des services dans backend/config/services.yaml : ces limites ne s'appliquent donc pas. Ni Traefik ni Nginx n'ajoutent de limite de débit.
Les paquets nécessaires sont installés. Activer le subscriber consiste à retirer son exclusion dans services.yaml. Deux points à vérifier d'abord : la limite globale (100 requêtes par minute et par IP) est basse pour une équipe entière derrière une même adresse de bureau, et l'adresse vue par Symfony doit être celle du client et non celle de Traefik (trusted_proxies).
Débloquer un compte
Le verrou tombe seul après 30 minutes. Pour lever le verrou plus tôt, un administrateur appelle POST /api/users/{id}/unlock (l'interface n'a pas de bouton dédié à ce jour), ou réinitialise le mot de passe avec app:reset-user-password, qui lève aussi le verrou. Une connexion réussie remet le compteur d'échecs à zéro.
Réponse 429
Les limiteurs de l'assistant répondent 429 Too Many Requests avec un message lisible. L'interface l'affiche tel quel ; il suffit d'attendre la fin de la fenêtre.