コンテンツにスキップ

SEC004 · サーバーのモジュールスコープ状態

重大度: warning · カテゴリ: security

SvelteKit のルート/フックファイル(+page(.server).ts+layout(.server).ts+server.tshooks.server.ts)で、モジュールスコープの let/var への関数内からの再代入(=+=??=++ など)を検出します。request handler から直接の再代入は、ヘルパー関数内のものより強いメッセージになります。

検出対象外: トップレベルでの初期化、const の binding、変異型キャッシュ(const cache = new Map() + cache.set(…))— 後者は意図的なメモ化パターンです(ただしリクエスト由来データを入れれば同じリスクがあります)。src/lib/server/** はスキャンしません(正当なシングルトンが置かれる場所のため)。SvelteKit の init フック内の代入 — サーバー起動時に一度だけ実行されるため対象外です。

SvelteKit のドキュメントいわく「サーバーでの共有状態を避けよ」。サーバー上のモジュール変数は全ユーザー共有の1インスタンスです — action が Alice のフォームデータをそこへ入れれば、次の Bob のリクエストがそれを読みます。プロセス再起動のたびに値が静かに消える問題もあります。

+page.server.ts
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 を書いてください。