import fs from "node:fs"; import path from "node:path"; // อ่าน PDF ต้นฉบับจาก public/ ฝั่ง server (F8 export) // - **อ่านอย่างเดียว ห้ามเขียนทับ** (invariant #1) — pdf-lib load เป็นสำเนาในหน่วยความจำ // - path guard: pdfUrl จาก DB ต้อง resolve แล้วอยู่ใน public/ เท่านั้น กัน path traversal (§5) export class PdfPathError extends Error {} export function resolvePublicPdfPath(pdfUrl: string): string { const publicDir = path.resolve(process.cwd(), "public"); // ตัด root นำหน้าออกก่อน — ไม่งั้น path.resolve บน Windows ถือ "/samples/.." เป็น absolute // ของไดรว์ (D:\samples\..) แล้วหลุดนอก publicDir const pdfPath = path.resolve(publicDir, pdfUrl.replace(/^[/\\]+/, "")); if (!pdfPath.startsWith(publicDir + path.sep)) { throw new PdfPathError("เส้นทางไฟล์ไม่ถูกต้อง"); } return pdfPath; } /** ไฟล์ PDF ตาม path ที่ผ่าน guard แล้ว (อ่านอย่างเดียว) */ export function readPublicPdf(pdfUrl: string): Buffer { return fs.readFileSync(resolvePublicPdfPath(pdfUrl)); }