概要
2件のセキュリティ・安定性問題をまとめて報告します。
問題1: .env が .gitignore に含まれていない
深刻度: MEDIUM
該当箇所
.gitignore (全体)
# 現在の設定
*.local # ← .env.local はカバーされる
.env ファイル自体はカバーされていません。開発者が GEMINI_API_KEY=xxx を .env に書いた場合、誤って git add . でコミットするリスクがあります。
修正方法
# 追加
.env
.env.*
!.env.example
問題2: 音声ファイルのサイズ制限がない
深刻度: MEDIUM
該当箇所
App.tsx の handleImport 関数 (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 の日次自動コードレビューにより作成されました。
概要
2件のセキュリティ・安定性問題をまとめて報告します。
問題1:
.envが.gitignoreに含まれていない深刻度: MEDIUM
該当箇所
.gitignore(全体).envファイル自体はカバーされていません。開発者がGEMINI_API_KEY=xxxを.envに書いた場合、誤ってgit add .でコミットするリスクがあります。修正方法
問題2: 音声ファイルのサイズ制限がない
深刻度: MEDIUM
該当箇所
App.tsxのhandleImport関数 (L69-111)問題の詳細
file.arrayBuffer()でブラウザのメモリに全展開されるhandleAiActionでそのバッファを Base64 エンコードして Gemini API に送信するため、巨大なペイロードが生成される修正方法
また、AI 解析の場合は別途時間制限も推奨:
このIssueは 2026-06-04 の日次自動コードレビューにより作成されました。