Validasi dan Upload Aman CodeIgniter 3 harus menggabungkan cek input, pengaturan session, serta upload handling sebelum data mencapai controller utama. Dalam artikel ini langsung dijelaskan arsitektur flow hingga langkah implementasi hooks/middleware untuk menangkal abuse seperti file berbahaya, CSRF, session fixation, dan exfiltrasi token.
Arsitektur Flow Validasi dan Upload Aman
Memulai dari permintaan masuk hingga file disimpan, susun flow jelas:
- Permintaan melewati hook/middleware keamanan untuk memastikan header CSRF, referer, dan token authentic.
- Validasi dan sanitasi input dilakukan melalui form_validation library dengan aturan berbasis context.
- Autentikasi dan session check memastikan user session valid dan tidak terikuasi session fixation.
- Upload handler hanya dijalankan setelah input diverifikasi, menetapkan temporary storage, whitelist MIME, dan pemeriksaan signature.
Flow ini memisahkan tanggung jawab sehingga upload tidak pernah langsung dieksekusi tanpa validasi contextual dan session yang aman.
Penguatan Validasi Input, Autentikasi, dan Secret
Gunakan form_validation dengan rules terspesifikasi sehingga hanya field sah yang diterima. Contoh aturan untuk form upload:
$this->form_validation->set_rules('judul', 'Judul', 'trim|required|max_length[120]|xss_clean');
$this->form_validation->set_rules('deskripsi', 'Deskripsi', 'trim|required');
Pastikan setiap validasi menangani konteks: upload gambar berbeda dengan upload dokumen. Gunakan callbacks untuk mengecek nilai khusus atau mengumpulkan error detail.
Untuk autentikasi dan session, aktifkan cookie enkripsi, gunakan config sess_encrypt_cookie dan:
$config['sess_cookie_name'] = 'ci_secure';
$config['sess_save_path'] = '/var/lib/php/sessions';
$config['sess_time_to_update'] = 300;
Simpan secret (API key, encryption key) di environment file di luar repo Git, lalu baca melalui getenv dan jangan commit ke config file. Contoh:
define('JWT_SECRET', getenv('CI_JWT_SECRET'));
Rahasiakan token untuk CSRF dan API, serta rotasi secara berkala bila memungkinkan.
Hardening Upload File
Upload file terlalu sering jadi pintu masuk malware. Terapkan langkah berikut:
- Whitelist MIME menggunakan
allowed_typesdan validasi manual tambahan denganfinfo_open(FILEINFO_MIME_TYPE). - Temporary staging sebelum memindahkan file ke storage final, sehingga file bisa discan oleh antivirus eksternal.
- Rename file menggunakan hash atau UUID untuk mencegah collision dan eksekusi skrip dari nama file user.
- Batasi ukuran dan jumlah file dengan konfigurasi
max_sizedanmax_filename. - Gunakan storage terpisah (bukan document root langsung) lalu expose melalui controller yang memeriksa hak akses.
Contoh konfigurasi upload di controller:
$config['upload_path'] = FCPATH . 'uploads/secure/';
$config['allowed_types'] = 'jpg|png|pdf';
$config['max_size'] = 2048;
$config['file_ext_tolower'] = true;
$config['encrypt_name'] = true;
$this->load->library('upload', $config);
if (! $this->upload->do_upload('dokumen')) {
log_message('error', 'Upload gagal: ' . $this->upload->display_errors());
show_error('Upload gagal validasi');
}
Select per tanggal permintaan, pindahkan file ke direktori final dengan permission 0640 dan simpan metadata di database agar validasi dapat di auditable.
Hooks atau Middleware untuk Cek Keamanan
CodeIgniter 3 menyediakan hook pre_controller untuk menyisipkan pemeriksaan sebelum controller dijalankan. Contoh hook yang memvalidasi CSRF token custom:
$hook['post_controller_constructor'][] = array(
'class' => 'SecurityHook',
'function' => 'checkCsrfToken',
'filename' => 'SecurityHook.php',
'filepath' => 'hooks'
);
Dalam class hook:
class SecurityHook {
public function checkCsrfToken() {
$CI =& get_instance();
$token = $CI->input->get_request_header('X-Csrf-Token');
if (empty($token) || $token !== $CI->session->userdata('csrf_token')) {
show_error('Forbidden', 403);
}
}
}
Hook ini menjamin setiap request API atau form sudah menyertakan token valid sebelum controller berjalan.
Cek Keamanan dan Pencegahan Abuse
Perkuat checklist pemeriksaan keamanan untuk menghindari serangan:
- CSRF: Pastikan form dan API yang mengubah data memerlukan token yang dibuat per session.
- Session Fixation: Regenerasi ID saat login dan logout, serta verifikasi IP/user-agent jika perlu.
- Exfiltrasi Token: Jangan kirim token lewat URL; kirimkan di header HTTPS dan limiti masa hidupnya.
Gunakan header
Authorizationuntuk API dan validasi ulang sebelum action sensitif. - Upload Berbahaya: Audit MIME, ekstensi, dan jalankan scan eksternal; laporkan mismatch ke log.
Debugging tip: gunakan profiler untuk memeriksa apakah hook berjalan dan log upload errors. Jika upload selalu gagal, periksa permission directory, batas upload pada PHP, dan isi display_errors sementara hanya di staging.
Dengan struktur validasi yang konsisten, hook security, penyimpanan secret yang benar, dan hardening upload, CodeIgniter 3 bisa beroperasi dengan lebih aman terhadap abuse.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!