2.9 KiB
2.9 KiB
TASKS - Review findings
- Critical - Unsigned auth cookie allows impersonation (
Infrastructure/PlayerIdentityExtensions.cs,Endpoints/EndpointHelpers.cs,wwwroot/js/api.js): Theplayercookie stores a raw GUID and is trusted on every request;/api/suggestions/allexposes other players' IDs, so a user can copy an ID, set the cookie, and become that account (including admins). Move to ASP.NET Core cookie auth with signed/encrypted tickets or a server-side session table, and avoid exposing player IDs where not necessary. - Critical - Stored XSS via suggestion content/links (
wwwroot/js/ui.js,wwwroot/index.html,Endpoints/SuggestEndpoints.cs): Names, descriptions, and URLs are injected withinnerHTMLand unescaped links;gameUrl/youtubeUrlaccept any scheme. A malicious suggestion can run script when viewed. Sanitize/escape on render (usetextContent), validate URLs to http/https on the server, and consider HTML sanitization for descriptions. - High - SSRF surface in screenshot validation (
Endpoints/EndpointHelpers.IsReachableImageAsync,SuggestEndpoints.cs): The server performs HEAD/GET requests to arbitrary user-provided URLs with minimal limits, enabling internal port probing and latency spikes. Restrict to allowlisted hosts or disable remote fetch; at minimum block private IPs/localhost, disallow redirects, and enforce tight size/time limits. - High - Phase recalculation writes on every poll (
Endpoints/EndpointHelpers.GetPhase,wwwroot/app.js):GetPhaseunconditionally callsSaveChangesAsync; the client polls/api/stateevery 4s, causing constant writes and SQLite WAL churn/locks even when nothing changes. Track achangedflag and persist only when state mutations occur; consider reducing poll frequency or using long polling/server push later. - Medium - Admin key accepted via query string (
Endpoints/EndpointHelpers.IsAdmin): Acceptingkeyin the query leaks secrets via logs and referrers. Require theX-Admin-Keyheader (or authenticated admin account) only, and rate-limit/monitor attempts. - Medium - Brittle base path detection on the client (
wwwroot/js/api.js): The heuristic that picks the first path segment can double-prefix or break when the app is nested (e.g.,/apps/vote/). Prefer explicit<meta name="app-base">or<base>and drop the autodetect fallback. - Maintenance - Centralize auth/phase concerns (multiple endpoints): Each endpoint manually fetches the player, admin status, and phase gating, repeating logic and increasing drift risk. Introduce endpoint filters/middleware to attach the current player and enforce phase/admin requirements declaratively.
- Maintenance - Clear invalid cookies (
Infrastructure/PlayerIdentityExtensions.cs): When a cookie references a deleted player, we keep reissuing it; endpoints respond 401 but the cookie persists. Clear the cookie if lookup fails to avoid client loops.