A 20-attempts-per-60s budget keyed by IP doesn't slow a distributed brute force that rotates source IPs. Add a parallel per-username bucket with the same threshold so a single account can't burn through more than 20 failed logins/min regardless of where they come from. Empty usernames aren't bucketed (would DoS the anonymous 401 path). Successful login clears both buckets. |
||
|---|---|---|
| .. | ||
| __init__.py | ||
| auth_routes.py | ||
| blueprint_routes.py | ||
| console_routes.py | ||
| files_routes.py | ||
| job_routes.py | ||
| log_routes.py | ||
| overlay_routes.py | ||
| page_routes.py | ||
| profile_routes.py | ||
| server_routes.py | ||
| workshop_routes.py | ||