Skip to content

Ikhtisar Keamanan

TCPDF-Next dibangun di atas filosofi desain security-first. Setiap komponen, dari primitif kriptografi hingga parsing HTML, direkayasa untuk menghilangkan seluruh kategori kerentanan alih-alih menambalnya setelah ditemukan.

Filosofi Desain Security-First

Keamanan di TCPDF-Next bukan fitur yang ditempelkan di atas codebase legacy. Ini adalah batasan arsitektur yang memengaruhi setiap keputusan desain sejak hari pertama:

  • Deny secara default -- Pemuatan resource eksternal, request jaringan, dan akses file diblokir kecuali secara eksplisit diizinkan.
  • Fail closed -- Ketika pemeriksaan keamanan tidak dapat dilakukan (misalnya, OCSP responder tidak terjangkau), operasi gagal alih-alih melanjutkan secara tidak aman.
  • Defense in depth -- Beberapa lapisan proteksi independen memastikan bahwa satu bypass tidak mengkompromikan sistem.
  • Attack surface minimal -- Nol dependensi Composer runtime. Semua operasi kriptografi menggunakan ekstensi OpenSSL dan Sodium built-in PHP.

Enkripsi AES-256 (Tanpa Algoritma Legacy)

TCPDF-Next secara eksklusif mengimplementasikan enkripsi AES-256 sebagaimana didefinisikan dalam PDF 2.0 (ISO 32000-2, Revision 6). Semua algoritma legacy dan tidak aman ditolak secara permanen:

AlgoritmaStatusAlasan
AES-256-CBCDidukungStandar PDF 2.0, tanpa serangan praktis yang diketahui
RC4 (40-bit / 128-bit)DilarangStream cipher dengan bias dan serangan praktis yang diketahui
AES-128DilarangMargin tidak cukup untuk kerahasiaan jangka panjang
DES / 3DESTidak diimplementasikanKerentanan ukuran blok dan panjang kunci
MD5 (untuk key derivation)DilarangSerangan collision sejak 2004
php
use YeeeFang\TcpdfNext\Encryption\EncryptionAlgorithm;
use YeeeFang\TcpdfNext\Encryption\Permissions;

$pdf->setEncryption()
    ->setAlgorithm(EncryptionAlgorithm::AES256)
    ->setUserPassword('reader-password')
    ->setOwnerPassword('admin-password')
    ->setPermissions(
        Permissions::PRINT_HIGH_QUALITY
        | Permissions::COPY
        | Permissions::ACCESSIBILITY
    )
    ->apply();

Tanda Tangan Digital PAdES (B-B hingga B-LTA)

TCPDF-Next mengimplementasikan Profil Baseline PAdES lengkap (ETSI EN 319 142-1) untuk tanda tangan digital dengan tingkat validitas jangka panjang yang meningkat:

LevelDeskripsiPeriode Validasi
PAdES B-BTanda tangan CMS dasar dengan signing certificateValiditas sertifikat (~1-3 tahun)
PAdES B-T+ Timestamp RFC 3161 dari TSA terpercayaValiditas sertifikat TSA (~10-15 tahun)
PAdES B-LT+ Document Security Store dengan data OCSP/CRLMasa hidup keamanan algoritma (~15-30 tahun)
PAdES B-LTA+ Archive timestamp untuk re-validasi tak terbatasTak terbatas (dengan re-timestamping berkala)

Untuk detail implementasi, lihat Tanda Tangan PAdES B-LTA.

Proteksi SSRF dengan DNS Pinning

Semua request jaringan eksternal (pengambilan gambar, komunikasi TSA, lookup OCSP) melewati HTTP client yang diperkuat dengan proteksi SSRF built-in:

  • DNS pinning -- Alamat IP yang di-resolve divalidasi sebelum koneksi. Rentang jaringan privat (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), loopback (127.0.0.0/8), dan link-local (169.254.0.0/16) diblokir.
  • Pembatasan protokol -- Hanya https:// yang diizinkan secara default. http:// biasa ditolak kecuali secara eksplisit diizinkan.
  • Allowlisting domain -- Allowlist yang dapat dikonfigurasi untuk domain eksternal yang diizinkan.
  • Following redirect -- Dibatasi ke maksimum yang dapat dikonfigurasi (default: 3) dengan re-validasi di setiap hop.

Pencegahan Path Traversal

Semua operasi path file disanitasi untuk mencegah serangan directory traversal:

  • Nama file tertanam dihilangkan dari separator path dan sekuens ...
  • Path file font di-resolve ke path kanonik absolut dan divalidasi terhadap direktori yang diizinkan.
  • Path gambar yang direferensikan dalam HTML dibatasi ke direktori yang dikonfigurasi secara eksplisit via ResourcePolicy.

#[\SensitiveParameter] pada Password dan Key

Semua parameter method yang menerima password, passphrase, private key, atau PIN dianotasi dengan atribut #[\SensitiveParameter] PHP 8.2. Ini memastikan bahwa nilai sensitif secara otomatis diredaksi dari stack trace, error log, dan pesan exception:

php
public function setUserPassword(
    #[\SensitiveParameter] string $password
): self { /* ... */ }

public function setCertificate(
    string $certificate,
    #[\SensitiveParameter] string $privateKey,
    #[\SensitiveParameter] string $passphrase = ''
): self { /* ... */ }

#[\NoDiscard] pada Return Value Kritis

Method yang mengembalikan hasil kritis keamanan (hasil validasi, verifikasi tanda tangan) dianotasi dengan #[\NoDiscard] untuk mencegah pemanggil mengabaikan return value:

php
#[\NoDiscard]
public function validate(string $pdfPath): ValidationResult { /* ... */ }

#[\NoDiscard]
public function verify(): SignatureVerificationResult { /* ... */ }

Mengabaikan return value ini menghasilkan warning compiler, menangkap kelas umum bug keamanan pada waktu pengembangan.

PHPStan Level 10 (Zero Error, Tanpa Baseline)

Seluruh codebase lulus analisis statis PHPStan pada level paling ketat (Level 10) dengan zero error dan tanpa file baseline. Ini berarti:

  • Tidak ada anotasi @phpstan-ignore di mana pun dalam codebase.
  • Tidak ada kategori error yang ditekan.
  • Semua type sepenuhnya dispesifikasi, termasuk generic dan template type.
  • Semua dead code path dihilangkan.

100% declare(strict_types=1)

Setiap file PHP di TCPDF-Next dimulai dengan declare(strict_types=1). Tanpa pengecualian. Ini menghilangkan seluruh kelas bug type coercion yang secara historis menyebabkan kerentanan keamanan di aplikasi PHP.

Pertimbangan Kepatuhan OWASP

TCPDF-Next menangani kategori OWASP berikut yang relevan dengan library pembuatan PDF:

Kategori OWASPMitigasi
A01 — Broken Access ControlIzin PDF granular, enkripsi berbasis sertifikat
A02 — Cryptographic FailuresAES-256 saja, tanpa algoritma lemah, perbandingan constant-time
A03 — InjectionSanitisasi HTML, pencegahan path traversal, tanpa eval()
A05 — Security MisconfigurationDefault aman, kebijakan resource deny-by-default
A06 — Vulnerable ComponentsNol dependensi runtime, crypto built-in via OpenSSL/Sodium
A07 — Authentication Failures#[\SensitiveParameter], secure memory wiping via sodium_memzero()
A10 — SSRFDNS pinning, pemblokiran jaringan privat, allowlisting domain

Dokumentasi Keamanan

Jelajahi dokumentasi keamanan lengkap:

Didistribusikan di bawah lisensi LGPL-3.0-or-later.