diff options
Diffstat (limited to 'pages/api/pdftron/createVendorDataReports.ts')
| -rw-r--r-- | pages/api/pdftron/createVendorDataReports.ts | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/pages/api/pdftron/createVendorDataReports.ts b/pages/api/pdftron/createVendorDataReports.ts index e145b5d5..f873bd50 100644 --- a/pages/api/pdftron/createVendorDataReports.ts +++ b/pages/api/pdftron/createVendorDataReports.ts @@ -90,12 +90,23 @@ function validateFileSize(size: number): { valid: boolean; error?: string } { function validateDirectory(directory: string): { valid: boolean; error?: string } { const normalizedDir = path.normalize(directory).replace(/^\/+/, ''); + // 경로 탐색 공격 방지 if (normalizedDir.includes('..') || normalizedDir.includes('//')) { return { valid: false, error: "안전하지 않은 디렉터리 경로입니다" }; } - if (path.isAbsolute(directory)) { - return { valid: false, error: "절대 경로는 사용할 수 없습니다" }; + // 절대 경로 검증 (단, 허용된 웹 경로 패턴은 제외) + const allowedPatterns = [ + /^\/api\/files\//, // 운영 환경: /api/files/vendorFormData/... + /^\/vendorFormData\//, // 개발 환경: /vendorFormData/... + /^\/[\w-]+\//, // 기타 상대 웹 경로: /directory/... + ]; + + const isAllowedWebPath = allowedPatterns.some(pattern => pattern.test(directory)); + + // Windows 절대 경로(C:\...) 또는 허용되지 않은 Unix 절대 경로 차단 + if (path.isAbsolute(directory) && !isAllowedWebPath) { + return { valid: false, error: "절대 파일 시스템 경로는 사용할 수 없습니다" }; } return { valid: true }; |
