SEC004 · サーバーのモジュールスコープ状態
重大度: warning · カテゴリ: security
チェック内容
Section titled “チェック内容”SvelteKit のルート/フックファイル(+page(.server).ts、+layout(.server).ts、+server.ts、hooks.server.ts)で、モジュールスコープの let/var への関数内からの再代入(=、+=、??=、++ など)を検出します。request handler から直接の再代入は、ヘルパー関数内のものより強いメッセージになります。
検出対象外: トップレベルでの初期化、const の binding、変異型キャッシュ(const cache = new Map() + cache.set(…))— 後者は意図的なメモ化パターンです(ただしリクエスト由来データを入れれば同じリスクがあります)。src/lib/server/** はスキャンしません(正当なシングルトンが置かれる場所のため)。SvelteKit の init フック内の代入 — サーバー起動時に一度だけ実行されるため対象外です。
SvelteKit のドキュメントいわく「サーバーでの共有状態を避けよ」。サーバー上のモジュール変数は全ユーザー共有の1インスタンスです — action が Alice のフォームデータをそこへ入れれば、次の Bob のリクエストがそれを読みます。プロセス再起動のたびに値が静かに消える問題もあります。
let user; // ❌ このサーバーの全ユーザーで1つの変数
export const actions = { default: async ({ request, cookies, locals }) => { const data = await request.formData(); user = { name: data.get('name') }; // ❌ NEVER DO THIS
await db.saveUser(locals.session, data); // ✅ ユーザーごとの永続化 }};cookies/locals で認証し、ユーザー別データはデータベースへ永続化します。意図的なプロセス全体キャッシュには const コンテナを使うか、代入行の直前に // svelte-vitals-disable-next-line SEC004 を書いてください。