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:
| Algoritma | Status | Alasan |
|---|---|---|
| AES-256-CBC | Didukung | Standar PDF 2.0, tanpa serangan praktis yang diketahui |
| RC4 (40-bit / 128-bit) | Dilarang | Stream cipher dengan bias dan serangan praktis yang diketahui |
| AES-128 | Dilarang | Margin tidak cukup untuk kerahasiaan jangka panjang |
| DES / 3DES | Tidak diimplementasikan | Kerentanan ukuran blok dan panjang kunci |
| MD5 (untuk key derivation) | Dilarang | Serangan collision sejak 2004 |
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:
| Level | Deskripsi | Periode Validasi |
|---|---|---|
| PAdES B-B | Tanda tangan CMS dasar dengan signing certificate | Validitas sertifikat (~1-3 tahun) |
| PAdES B-T | + Timestamp RFC 3161 dari TSA terpercaya | Validitas sertifikat TSA (~10-15 tahun) |
| PAdES B-LT | + Document Security Store dengan data OCSP/CRL | Masa hidup keamanan algoritma (~15-30 tahun) |
| PAdES B-LTA | + Archive timestamp untuk re-validasi tak terbatas | Tak 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:
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:
#[\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-ignoredi 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 OWASP | Mitigasi |
|---|---|
| A01 — Broken Access Control | Izin PDF granular, enkripsi berbasis sertifikat |
| A02 — Cryptographic Failures | AES-256 saja, tanpa algoritma lemah, perbandingan constant-time |
| A03 — Injection | Sanitisasi HTML, pencegahan path traversal, tanpa eval() |
| A05 — Security Misconfiguration | Default aman, kebijakan resource deny-by-default |
| A06 — Vulnerable Components | Nol dependensi runtime, crypto built-in via OpenSSL/Sodium |
| A07 — Authentication Failures | #[\SensitiveParameter], secure memory wiping via sodium_memzero() |
| A10 — SSRF | DNS pinning, pemblokiran jaringan privat, allowlisting domain |
Dokumentasi Keamanan
Jelajahi dokumentasi keamanan lengkap:
- Praktik Terbaik Keamanan -- Validasi input, manajemen sertifikat, keamanan deployment
- Ikhtisar Keamanan -- Vektor serangan tanda tangan PDF dan mitigasi