From aae58f645ac4dd9d2142c084bb47cec5fdb3d5eb Mon Sep 17 00:00:00 2001 From: claude-bot Date: Fri, 15 May 2026 18:10:27 +0900 Subject: [PATCH] fix: harden UPLOAD_MAX_BYTES parsing; sync docs with 1 GiB default MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 리뷰어 지적사항 반영: - "abc" 같은 오타도 Infinity 로 풀리던 문제 수정. 잘못된 값은 기본 1 GiB 로 fallback 하고 경고 로그를 남김. 무제한은 "0" 또는 "Infinity" 만 명시적으로 인정. - .env.example / README 의 "비우면 무제한" 표현을 코드 동작과 일치시켜 "비우면 기본 1 GiB" 로 정정. Co-Authored-By: Claude Opus 4.7 --- .env.example | 3 ++- README.md | 2 +- src/routes/op.ts | 17 ++++++++++++----- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/.env.example b/.env.example index 02f070e..2633f71 100644 --- a/.env.example +++ b/.env.example @@ -10,7 +10,8 @@ PORT=3000 SESSION_SECRET=change-me-please # 업로드/타임아웃 ───────────────────────────────────────────────── -# 업로드 용량 한도(바이트). 1 GiB = 1073741824. 비우거나 미설정이면 무제한. +# 업로드 용량 한도(바이트). 1 GiB = 1073741824. 비우거나 미설정이면 기본 1 GiB. +# 무제한으로 두려면 0 또는 Infinity. 잘못된 값(오타 등)은 기본 1 GiB 로 fallback. UPLOAD_MAX_BYTES=1073741824 # HTTP 요청 타임아웃(밀리초). 0 또는 미설정이면 무제한 (10GB 업로드 같은 케이스 대비). diff --git a/README.md b/README.md index db33d5e..0f1d49c 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ npm start - `HOST` — 바인딩 주소. 외부 노출이 필요하면 `0.0.0.0`, 로컬 전용이면 `127.0.0.1`. - `PORT` — 바인딩 포트 (기본 `3000`). - `SESSION_SECRET` — 운영 시 반드시 충분히 긴 랜덤 문자열로 교체. -- `UPLOAD_MAX_BYTES` — 업로드 용량 한도(바이트). 기본 `1073741824` (1 GiB). 비우면 무제한. +- `UPLOAD_MAX_BYTES` — 업로드 용량 한도(바이트). 비우거나 미설정이면 기본 `1073741824` (1 GiB). 무제한으로 두려면 `0` 또는 `Infinity`. 잘못된 값은 기본 1 GiB 로 fallback. - `HTTP_REQUEST_TIMEOUT_MS` — 대용량 업로드용 HTTP 요청 타임아웃(밀리초). `0`/미설정이면 무제한. - 관리자 비밀번호는 `account.json` 의 `password` 값 (초기값 `admin`, 운영 시 반드시 변경). diff --git a/src/routes/op.ts b/src/routes/op.ts index dd6d96f..242b3ef 100644 --- a/src/routes/op.ts +++ b/src/routes/op.ts @@ -32,14 +32,21 @@ import { FfmpegUnavailableError, applyTrimToVideo } from '../editor.js' export const opRouter = Router() // 업로드 용량 상한. 기본 1 GiB. UPLOAD_MAX_BYTES 환경변수로 변경 가능. -// 명시적으로 무제한이 필요하면 UPLOAD_MAX_BYTES=0 (또는 Infinity). +// - 비어있거나 미설정이면 기본 1 GiB +// - "0" 또는 "Infinity" 만 명시적 무제한으로 인정 +// - 잘못된 값 (오타 등) 은 기본 1 GiB 로 fallback (경고 출력) const DEFAULT_UPLOAD_MAX_BYTES = 1024 * 1024 * 1024 const uploadMaxBytes = (() => { const raw = process.env.UPLOAD_MAX_BYTES - if (raw === undefined || raw === '') return DEFAULT_UPLOAD_MAX_BYTES - const n = Number(raw) - if (!Number.isFinite(n) || n <= 0) return Infinity - return Math.max(1, n) + if (raw === undefined || raw.trim() === '') return DEFAULT_UPLOAD_MAX_BYTES + const trimmed = raw.trim() + if (trimmed === '0' || trimmed.toLowerCase() === 'infinity') return Infinity + const n = Number(trimmed) + if (!Number.isFinite(n) || n <= 0) { + console.warn(`[upload] invalid UPLOAD_MAX_BYTES=${JSON.stringify(raw)}; falling back to default ${DEFAULT_UPLOAD_MAX_BYTES} bytes`) + return DEFAULT_UPLOAD_MAX_BYTES + } + return Math.max(1, Math.floor(n)) })() const upload = multer({ dest: tmpDir,