mirror of
https://github.com/ZHANGTIANYAO1/teamspeak-music-bot.git
synced 2026-10-02 04:52:50 +08:00
feat(auth): rate-limit /login+/setup, per-user session cap, periodic /me poll
This commit is contained in:
1 parent
1a11489f2e
commit
a39fc25104
6 files changed
+161
-1
No files matched your search
@@ -24,6 +24,7 @@ import { createSessionStore } from "../data/sessions.js";
|
||||
import { createRequireAuth } from "./middleware/requireAuth.js";
|
||||
import { requireAdmin } from "./middleware/requireAdmin.js";
|
||||
import { csrfOriginCheck } from "./middleware/csrf.js";
|
||||
import { createRateLimit } from "./middleware/rateLimit.js";
|
||||
import { validateSessionFromHeaders } from "./auth/validateSession.js";
|
||||
|
||||
const SESSION_CLEANUP_INTERVAL_MS = 60 * 60 * 1000; // 1 hour
|
||||
@@ -74,6 +75,14 @@ export function createWebServer(options: WebServerOptions): WebServer {
|
||||
res.json({ publicUrl: raw ? raw.replace(/\/+$/, "") : null });
|
||||
});
|
||||
|
||||
// Anti-DoS: throttle expensive (bcrypt) auth endpoints.
|
||||
// 5 req per minute per IP for /login (capacity 5, refill 5/60 = ~0.083/sec).
|
||||
// 3 req per minute per IP for /setup (more limited; first-run is rare).
|
||||
const loginLimit = createRateLimit({ capacity: 5, refillPerSec: 5 / 60 });
|
||||
const setupLimit = createRateLimit({ capacity: 3, refillPerSec: 3 / 60 });
|
||||
app.use("/api/session/login", loginLimit);
|
||||
app.use("/api/session/setup", setupLimit);
|
||||
|
||||
app.use("/api/session", createSessionRouter(users, sessions, audit, logger));
|
||||
|
||||
// ─── Gates for everything else under /api ───────────────────────────────
|
||||
|
||||
Reference in new issue
Block a user