Lewati ke konten
Naandalist
•
3 min read
•
v2.0.0
secure-file-validator

secure-file-validator

Helper Node.js tanpa dependency untuk pengecekan tipe unggahan: ekstensi, ukuran, magic number, plus kebijakan konten PDF dan SVG yang ringkas.

Selaras dengan bagian pengecekan tipe file dari OWASP Unrestricted File Upload dan CWE-434. Bukan antivirus. Bukan stack keamanan unggahan yang lengkap.

Fitur

  • Validasi ekstensi, ukuran, dan magic number
  • Kebijakan token nama PDF (termasuk nama hex-escaped dan Flate stream)
  • Kebijakan SVG untuk script, javascript:, event handler, dan embed berisiko
  • Input path atau buffer / Uint8Array
  • Kode hasil yang stabil untuk branching di aplikasi
  • Tanpa dependency (Node.js 14.16+, ESM)

Instalasi

npm install secure-file-validator

Penggunaan

Mulai cepat

import { validateFile } from "secure-file-validator";

const result = await validateFile("uploads/photo.jpg");

if (result.ok) {
  // result.code === "OK"
} else {
  // result.code === "INVALID_SIGNATURE" | "PDF_JAVASCRIPT" | ...
  console.error(result.code, result.message);
}

result.status masih ada sebagai alias deprecated dari result.ok.

Dari buffer unggahan

import { validateFile, validateBytes } from "secure-file-validator";

const result = await validateFile(req.file.buffer, {
  filename: req.file.originalname, // atau extension: ".png"
});

if (!result.ok) {
  throw new Error(result.code);
}

const sync = validateBytes(req.file.buffer, { extension: ".png" });

Input buffer / Uint8Array wajib menyertakan filename atau extension. Ukuran dicek lewat byteLength.

Tipe yang didukung

Extension Magic check
.jpg / .jpeg FF D8 FF
.png 89 50 4E 47
.gif 47 49 46 38
.pdf %PDF + %%EOF, lalu kebijakan token
.svg <?xml atau <svg, lalu kebijakan SVG

Batas ukuran default: 5MB (options.maxSizeInBytes).

Kebijakan PDF

Token Default code
/Metadata allow PDF_METADATA
/Annots allow PDF_ANNOTS
/OpenAction allow PDF_OPEN_ACTION
/JS, /JavaScript deny PDF_JAVASCRIPT
/Launch deny PDF_LAUNCH
/EmbeddedFile deny PDF_EMBEDDED_FILE
/XFA deny PDF_XFA
/RichMedia deny PDF_RICH_MEDIA
const strict = await validateFile(pdfPath, {
  pdf: { allowOpenAction: false },
});

// Berbahaya: mematikan pengecekan script
const trusted = await validateFile(pdfPath, {
  pdf: { allowJavaScript: true },
});

Kebijakan SVG

Selalu ditolak: <script>, javascript:, event handler (onload= …), <!ENTITY.

Ditolak secara default, bisa diubah lewat options.svg:

Rule Default code
foreignObject deny SVG_FOREIGN_OBJECT
data: URI deny SVG_DATA_URI
external href deny SVG_EXTERNAL_HREF
await validateFile(svgPath, {
  svg: { allowDataUri: true },
});

Bentuk hasil

{
  ok: false,
  status: false, // alias deprecated dari ok
  code: "PDF_JAVASCRIPT",
  message: "Suspicious PDF name token detected: /JavaScript",
  details: { token: "JavaScript" }
}

Lisensi

MIT

Untuk detail lebih lanjut, kunjungi repositori GitHub.