BuidlZone-Labs/zicket-web

Shared Mutable Module State Leaks Data Across SSR Requests

開放

#174 建立於 2026年7月29日

 (9 則留言) (0 個反應) (1 位負責人)TypeScript (43 個分叉)auto 404
Stellar Wavebugdifficulty: mediumhelp wantedsecurity

倉庫指標

星標
 (4 顆星)
PR 合併指標
 (PR 指標待抓取)

描述

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

  1. Replace module-level mutable variables with React Context or scoped state providers (SessionProvider).
  2. Ensure SSR fallback getServerSnapshot returns 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 + useSyncExternalStore safely.

Files

  • lib/user-session-sync.ts

貢獻者指南