Skip to content

[SECURITY] Gemini API key exposed in client-side bundle via Vite define #1

Description

@stewroux

概要

深刻度: HIGH

vite.config.tsdefine 設定により、GEMINI_API_KEY が JavaScript バンドルに静的文字列として埋め込まれます。ブラウザの DevTools > Sources で誰でも確認可能な状態です。

該当箇所

vite.config.ts (全体)

define: {
  'process.env.API_KEY': JSON.stringify(env.GEMINI_API_KEY),
  'process.env.GEMINI_API_KEY': JSON.stringify(env.GEMINI_API_KEY)
},

utils/geminiClient.ts L5-6

// NOTE: In a real production app, move this logic to a server-side endpoint.
const ai = new GoogleGenAI({ apiKey: process.env.API_KEY });

問題の詳細

  • Vite の defineビルド時に文字列置換 を行うため、ビルド後の JS に API キーがリテラルとして残る
  • server/api/analyze.ts にサーバーサイド実装のサンプルが存在するが、コメントアウトされており未実装
  • 本番デプロイ時に API キーが公開状態になるリスクが高い

修正方針

短期対応(緊急)

  1. 現在の API キーを Google AI Studio でローテーション
  2. .env ファイルに API キーが入っている場合、git log を確認してコミット履歴から漏洩していないか確認

中期対応(推奨)

server/api/analyze.ts のサンプルをベースに、サーバーサイドエンドポイントを実装する:

クライアント → POST /api/analyze (音声データ) → サーバー → Gemini API
                                                    ↑
                                               API キーはここだけ

Next.js / Vercel Edge Functions / Cloudflare Workers などを活用することで、API キーをサーバー環境変数として安全に管理できる。

暫定対応(開発環境のみ許容)

現状の構成は ローカル開発・個人利用のみ に限定し、公開デプロイは行わない。

参考


このIssueは 2026-06-04 の日次自動コードレビューにより作成されました。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions