Skip to content

[SECURITY] .env not in .gitignore + no audio file size limit (memory exhaustion risk) #2

Description

@stewroux

概要

2件のセキュリティ・安定性問題をまとめて報告します。


問題1: .env.gitignore に含まれていない

深刻度: MEDIUM

該当箇所

.gitignore (全体)

# 現在の設定
*.local   #  .env.local はカバーされる

.env ファイル自体はカバーされていません。開発者が GEMINI_API_KEY=xxx.env に書いた場合、誤って git add . でコミットするリスクがあります。

修正方法

# 追加
.env
.env.*
!.env.example

問題2: 音声ファイルのサイズ制限がない

深刻度: MEDIUM

該当箇所

App.tsxhandleImport 関数 (L69-111)

const handleImport = async (e: React.ChangeEvent<HTMLInputElement>) => {
  const file = e.target.files?.[0];
  if (!file) return;
  // ← ここにファイルサイズチェックがない
  
  setIsProcessing(true);
  try {
    const arrayBuffer = await file.arrayBuffer();  // GB単位のファイルを全メモリに展開

問題の詳細

  • ユーザーが数GB の音声ファイルを選択すると、file.arrayBuffer() でブラウザのメモリに全展開される
  • ブラウザタブがクラッシュ (OOM) したり、PC全体がフリーズするリスクがある
  • さらに handleAiAction でそのバッファを Base64 エンコードして Gemini API に送信するため、巨大なペイロードが生成される

修正方法

const MAX_FILE_SIZE_MB = 200;
const MAX_FILE_SIZE_BYTES = MAX_FILE_SIZE_MB * 1024 * 1024;

const handleImport = async (e: React.ChangeEvent<HTMLInputElement>) => {
  const file = e.target.files?.[0];
  if (!file) return;
  
  // ← 追加: ファイルサイズチェック
  if (file.size > MAX_FILE_SIZE_BYTES) {
    setErrorMessage(`File too large. Maximum size is ${MAX_FILE_SIZE_MB}MB.`);
    e.target.value = '';
    return;
  }
  // ...
};

また、AI 解析の場合は別途時間制限も推奨:

const MAX_AI_DURATION_SEC = 300; // 5分

const handleAiAction = async (task: 'transcribe' | 'summarize') => {
  if (editorState.duration > MAX_AI_DURATION_SEC) {
    setErrorMessage('Audio too long for AI analysis. Maximum 5 minutes.');
    return;
  }
  // ...
};

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingsecurity

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions