Lewati ke konten

Keamanan dan operasi — NextPDF di CodeIgniter 4

Halaman ini menjelaskan ancaman yang harus ditangkal oleh integrasi ini, kontrol yang telah diverifikasi dalam kode sumber paket, serta aturan operasional yang sebaiknya Anda ikuti untuk penerapan yang aman.

Anda perlu memperhitungkan tiga permukaan serangan yang dapat dipengaruhi penyerang.

  1. Payload job antrean. Antrean menyimpan data job. Penyerang yang memiliki akses ke broker dapat mengubah data tersebut. Perlakukan data itu sebagai input hasil deserialisasi yang tidak tepercaya.
  2. Nama berkas respons. Pengguna dapat memberikan nama berkas unduhan. Nama yang berbahaya dapat menyuntikkan konten header.
  3. Jalur konfigurasi. Jalur fon dan jalur penandatanganan berasal dari konfigurasi. Jalur yang berbahaya dapat menyebabkan pembacaan dari atau penulisan ke lokasi yang salah.

Job antrean memperlakukan payload-nya sebagai data hasil deserialisasi yang tidak tepercaya. Open Worldwide Application Security Project (OWASP) Application Security Verification Standard (ASVS) mensyaratkan penanganan input yang aman untuk data hasil deserialisasi yang tidak tepercaya (ASVS V1.5.2).

Kontrol yang terverifikasi di GeneratePdfJob:

  • Builder harus berupa string yang tidak kosong. Job menolak tipe lainnya.
  • Builder harus sesuai dengan pola App\PdfBuilders\<Class>::<method>. Job menolak namespace lain, fungsi biasa, serta payload yang memiliki prefiks atau sufiks.
  • Builder harus dapat dipanggil (callable). Job menolak string yang sesuai dengan pola tetapi tidak dapat diselesaikan.

Bersama-sama, aturan-aturan ini memblokir eksekusi kode sembarang melalui payload antrean yang dimanipulasi. Pengujian paket memverifikasi setiap kasus penolakan.

Kontrol 2 — Pembatasan jalur keluaran antrean

Bagian berjudul “Kontrol 2 — Pembatasan jalur keluaran antrean”

Job menulis berkas ke disk. OWASP ASVS mensyaratkan penanganan jalur yang aman ketika aplikasi membuat jalur berkas untuk operasi berkas (ASVS V5.3.2).

Kontrol yang terverifikasi di GeneratePdfJob:

  • Jalur keluaran harus berupa string yang tidak kosong.
  • Job menormalkan jalur sebelum melakukan pemeriksaan apa pun. Job menyelesaikan segmen . dan .. serta mengonversi pemisah jalur.
  • Jalur yang dinormalkan harus berada di dalam WRITEPATH/pdfs/. Job menolak direktori sejajar yang memiliki prefiks nama yang sama (pdfs-evil/).
  • Jalur harus berakhir dengan .pdf (tidak peka huruf besar/kecil).

Aturan-aturan ini memblokir penulisan berkas sembarang melalui payload yang dimanipulasi.

PdfResponse melampirkan kumpulan header tetap yang diperkeras pada setiap respons Portable Document Format (PDF):

HeaderNilai
X-Content-Type-Optionsnosniff
X-Frame-OptionsDENY
Content-Security-Policydefault-src 'none'
X-Robots-Tagnoindex, nofollow
Referrer-Policyno-referrer
Cache-Controlprivate, max-age=0, must-revalidate

Paket membersihkan nama berkas sebelum nama tersebut masuk ke header. Paket menghapus pemisah jalur, null byte, serta carriage return/line feed (CR/LF). Paket meng-escape tanda kutip ganda untuk bentuk yang dikutip. Paket menambahkan parameter Request for Comments (RFC) 5987 filename*=UTF-8''… untuk nama non-ASCII. Nama yang kosong menjadi document.pdf.

Registry fon menolak nilai fontsPath yang mengandung stream wrapper (://) atau null byte. Registry menghasilkan runtime error. Ini memblokir jalur yang dibungkus seperti php:// atau phar://.

Kontrol 5 — Permukaan service-locator yang minimal

Bagian berjudul “Kontrol 5 — Permukaan service-locator yang minimal”

CodeIgniter 4 tidak menyediakan kontainer PHP Standards Recommendation 11 (PSR-11). Framework ini menggunakan locator Services. PSR-11 §1.3 menganggap pola service-locator sebagai pola yang tidak disarankan (modal SHOULD NOT). Paket menjaga permukaan locator tetap kecil: setiap layanan memiliki satu metode factory bernama. Selesaikan layanan di batas controller. Teruskan objek konkret ke lapisan dalam. Jangan meneruskan kelas Services ke dalam kode domain.

Operasi penandatanganan dan TSA (NextPDF Pro / Enterprise)

Bagian berjudul “Operasi penandatanganan dan TSA (NextPDF Pro / Enterprise)”

Layanan penandatanganan tetap nonaktif secara default. Layanan ini aktif hanya ketika signature.enabled bernilai true dan signature.certificate tidak kosong. Tingkat tanda tangan default paket adalah B-B. NextPDF Pro menyediakan tanda tangan baseline B-B. Validasi jangka panjang adalah kapabilitas Enterprise terpisah yang didokumentasikan dalam referensi Premium, bukan di sini.

Aturan operasional:

  • Jangan menyimpan berkas sertifikat dan kunci di source control. Sediakan berkas tersebut melalui .env atau secrets manager.
  • Pastikan tsa.allow_insecure_http tetap diatur ke false di produksi. Saluran Time Stamping Authority (TSA) dalam teks polos tidak dapat diterima.
  • Atur tsa.pinned_public_keys ketika TSA menerbitkan kunci yang stabil. Pastikan tsa.warn_on_key_rotation tetap diatur ke true.
  • Batasi akses baca pada berkas kunci hanya untuk pengguna aplikasi.
  • Pastikan semua versi hasil resolusi terkunci di composer.lock.
  • Tambahkan codeigniter4/queue sebagai dependency pada aplikasi yang menjalankan worker.
  • Jalankan worker antrean sebagai pengguna berhak akses rendah. Berikan akses tulis hanya ke WRITEPATH/pdfs/.
  • Pasang ekstensi NextPDF yang sama pada worker seperti pada lapisan web. PDF yang ditandatangani membutuhkan NextPDF Pro atau Enterprise di lingkungan worker.
  • Pastikan ekstensi mbstring dan zlib tersedia di setiap runtime yang membangun PDF.
  • Pastikan header respons tetap bertahan melewati reverse proxy.
  • Catat pembuatan PDF beserta konteksnya. Jangan mencatat material sertifikat atau kata sandi kunci.
  • Penanganan payload antrean selaras dengan OWASP ASVS V1.5.2.
  • Penanganan jalur keluaran antrean selaras dengan OWASP ASVS V5.3.2.
  • Desain locator mengikuti panduan PSR-11 §1.3.

NextPDF Core dilisensikan di bawah Apache-2.0. Trust anchor tanda tangan dan pengerasan TSA berlaku ketika NextPDF Pro atau Enterprise terpasang. Paket CodeIgniter mengekspos metode layanan terkait, yang mengembalikan null sampai paket Premium yang sesuai terpasang. Lihat </get-license/?intent=codeigniter-signing>.

  • /integrations/codeigniter/production-usage/ — registrasi dan dispatch antrean yang tepat.
  • /integrations/codeigniter/configuration/ — penandatanganan, TSA, dan kunci jalur.
  • /integrations/codeigniter/troubleshooting/ — pesan penolakan yang terverifikasi.
  • /integrations/codeigniter/overview/ — seluruh permukaan API.