security(relay): fix lockout DoS and DOM XSS in web client
Addresses two Major findings from PR review: - Auth lockout no longer griefable: the throttle key is namespaced per path and includes the client IP (web:<session>:<ip> vs desktop:<session>:<ip>), so a flood of bad web-client auths can neither lock other clients of the same session nor block the desktop from (re)authenticating. Per-socket failure close and brute-force lockout are preserved. - Relay web client XSS eliminated: app.html tab/macro rendering rebuilt with createElement/textContent (no macro/tab value reaches innerHTML); inline scripts/handlers externalized to /static/app.js and /static/login.js so the helmet CSP now uses script-src 'self' (dropped 'unsafe-inline' for scripts). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,8 +1,12 @@
|
||||
// Per-session-id auth brute-force lockout (in-memory).
|
||||
// Auth brute-force lockout (in-memory).
|
||||
//
|
||||
// Tracks failed authentication attempts keyed by session id. After
|
||||
// `authLockoutMaxAttempts` failures within `authLockoutWindowMs`, further
|
||||
// attempts are rejected until `authLockoutDurationMs` has elapsed.
|
||||
// Tracks failed authentication attempts keyed by an opaque, namespaced key
|
||||
// (e.g. `web:${sessionId}:${clientIp}` or `desktop:${sessionId}:${clientIp}`).
|
||||
// Namespacing by path and client IP keeps the web and desktop keyspaces
|
||||
// separate so one abusive web client cannot lock out other users or the
|
||||
// desktop for the same session. After `authLockoutMaxAttempts` failures within
|
||||
// `authLockoutWindowMs`, further attempts are rejected until
|
||||
// `authLockoutDurationMs` has elapsed.
|
||||
|
||||
import { config } from '../config';
|
||||
|
||||
|
||||
Reference in New Issue
Block a user