BuidlZone-Labs/zicket-web
Shared Mutable Module State Leaks Data Across SSR Requests
Chiusa
#174 aperta il 29 lug 2026
Stellar Wavebugdifficulty: mediumhelp wantedsecurity
Metriche repository
- Star
- (4 stelle)
- Metriche merge PR
- (Merge medio 2g 13h) (9 PR mergiate in 30 g)
Descrizione
Category
Bug
Priority
High
Description
In lib/user-session-sync.ts, state is defined at module scope (let state = { anonymousBrowsing: false, walletConnected: false }). During Server-Side Rendering (SSR), useSyncExternalStore invokes getServerSnapshot = () => state. Because Node.js keeps module scope variables across incoming HTTP requests, modifying state during SSR leaks state across concurrent users.
Evidence from lib/user-session-sync.ts#L16-L19:
let state: SessionState = {
anonymousBrowsing: false,
walletConnected: false,
};
Proposed Solution
- Replace module-level mutable variables with React Context or scoped state providers (
SessionProvider). - Ensure SSR fallback
getServerSnapshotreturns a static default state object.
Acceptance Criteria
- Session state is scoped per request / component tree using React Context.
- No module-level mutable variables used for SSR snapshots.
- Session persistence across tabs uses React Context +
useSyncExternalStoresafely.
Files
lib/user-session-sync.ts