Security: - H1: Stored-XSS-Fix — Upload-Pfad-Whitelist (Server + Frontend-Guard safeFileUrl) - H2: Transaktionen repariert — txDb-Contract in db.js (PG + SQLite), Rollback funktioniert - H3-Vorbereitung: SESSION_SECRET wird in Compose durchgereicht (Fix M3) - registerLimiter exportiert (Crash-Bug: Route.post ohne Callback) - LDAP-Sync: PG-Transaktionsabbruch bei UNIQUE-Verstoß behoben (Precheck-Selects) - LDAP-Filter: nur echte Benutzerkonten (keine Computer/Service-Accounts, Bit 512) - Rollen app-seitig: Sync ändert nie role/status, neue User immer user+inaktiv - DB-Cleanup: 82 Computer-/Service-Accounts aus lokaler User-Tabelle entfernt UX: - Dashboard: Vorlagen als Table-Liste + Column-Chart (Top 5 in %), 2 gleich große Spalten - Table-Listen (Dashboard/Vorlageneditor/Aufgaben) scrollbar bis Seitenende - Pagination 10/Seite im Dashboard, Sidebar-Label Dashboard
56 lines
1.7 KiB
JavaScript
56 lines
1.7 KiB
JavaScript
/**
|
|
* Rate limiting configuration module.
|
|
*
|
|
* Punkt 23: User-level rate limiting for critical endpoints.
|
|
*/
|
|
const rateLimit = require('express-rate-limit');
|
|
|
|
// General API rate limit: 100 requests per minute per IP
|
|
const apiLimiter = rateLimit({
|
|
windowMs: 60 * 1000,
|
|
max: 100,
|
|
standardHeaders: true,
|
|
legacyHeaders: false,
|
|
message: { error: 'Zu viele Anfragen. Bitte später erneut versuchen.' },
|
|
});
|
|
|
|
// Login rate limit: 5 attempts per minute per IP (brute-force protection)
|
|
const loginLimiter = rateLimit({
|
|
windowMs: 60 * 1000,
|
|
max: 5,
|
|
standardHeaders: true,
|
|
legacyHeaders: false,
|
|
message: { error: 'Zu viele Anmeldeversuche. Bitte in 1 Minute erneut versuchen.' },
|
|
});
|
|
|
|
// H5: Register rate limit: 10 registrations per hour per IP (prevents account
|
|
// flooding, audit-log spam, and bcrypt CPU abuse)
|
|
const registerLimiter = rateLimit({
|
|
windowMs: 60 * 60 * 1000,
|
|
max: 10,
|
|
standardHeaders: true,
|
|
legacyHeaders: false,
|
|
message: { error: 'Zu viele Registrierungsversuche. Bitte später erneut versuchen.' },
|
|
});
|
|
|
|
// Punkt 23: Task creation rate limit: 20 per minute per user
|
|
const taskCreateLimiter = rateLimit({
|
|
windowMs: 60 * 1000,
|
|
max: 20,
|
|
standardHeaders: true,
|
|
legacyHeaders: false,
|
|
skip: (req) => !req.user,
|
|
message: { error: 'Zu viele Auftragsanfragen. Bitte später erneut versuchen.' },
|
|
});
|
|
|
|
// Punkt 23: File upload rate limit: 10 per minute per user
|
|
const uploadLimiter = rateLimit({
|
|
windowMs: 60 * 1000,
|
|
max: 10,
|
|
standardHeaders: true,
|
|
legacyHeaders: false,
|
|
skip: (req) => !req.user,
|
|
message: { error: 'Zu viele Upload-Anfragen. Bitte später erneut versuchen.' },
|
|
});
|
|
|
|
module.exports = { apiLimiter, loginLimiter, registerLimiter, taskCreateLimiter, uploadLimiter }; |