Tiga Fix Kecil yang Bikin API Lebih Jujur
Catatan kosong dapat pesan error yang nggak nyambung, aktor yang hilang dicatat diam-diam, dan subject email berisi teks bebas pengaju. Tiga perbaikan kecil,
Ringkasan
bug pesan error ngaco karena cek generik duluan, sekarang cek catatan wajib dulu jadi balik NOTE_REQUIRED yang jelas. konteks aktor hilang dulu kecatet jadi sistem, sekarang langsung ditolak 401 biar jejak audit nggak bohong. subjek email dari input user sekarang dibersihin dari newline biar nggak bisa nyuntik header.
Pesan yang Nggak Nyambung dengan Masalahnya
Ada admin yang nyimpen tindak lanjut tanpa isi catatan, dan respons API-nya bilang: INVALID_INPUT, "jenis atau status tidak valid". Yang salah itu catatan kosong, tapi pesannya nunjuk jenis dan status. Frontend nggak salah baca; memang API-nya yang ngasih jawaban melenceng. Saya sempat menyalahkan frontend dulu, kirain yang dikirim salah field. Ternyata di sisi server pun semua jelas: error catatan wajib itu terbungkus error input generik, dan mapping handler mengecek yang generik lebih dulu.
Di kode, error catatan wajib itu membungkus error input generik (pola bungkus error yang lazim di Go), sementara mapping handler ngecek pakai rantai sentinel lewat errors.Is dari yang paling spesifik ke yang paling umum [1]. Karena pemeriksaan catatan ditaruh di bawah, pesan spesifiknya tenggelam di mapping generik. Fix-nya cuma mengubah urutan: cek error catatan dulu, balikin respons bad request dengan kode NOTE_REQUIRED dan pesan yang nyambung: catatan tindak lanjut wajib diisi, minimal lima karakter. Statusnya tetap bad request, kode yang tepat untuk kesalahan sisi klien [2]; yang berubah cuma kejujuran isinya.
Aktor yang Hilang Ditolak, Bukan Dicatat Diam-Diam
Fix kedua lebih halus. Aktor update status diambil dari context JWT, dan nilai nol dipakai sebagai tanda "sistem" yang disimpan sebagai NULL di riwayat. Kode lamanya narik nilai context tanpa ngecek ada nggaknya: kalau context hilang, aktor diam-diam jadi nol, dan jejaknya tercatat sebagai aksi sistem. Padahal rantai middleware JWT emang selalu mendahului handler ini; yang bikin context kosong cuma satu, misconfig rute. Justru situasi segitunya yang harus gagal keras.
Urutan cek sentinel semacam ini enak dibaca sebagai daftar prioritas pesan: error yang membungkus error lain harus dicek paling dulu, dari yang paling spesifik ke yang paling umum. Cara membuktikannya juga murah: kirim payload tanpa catatan, lihat responsnya. Harusnya kode error kini NOTE_REQUIRED dengan pesan yang nyambung; kalau masih INVALID_INPUT, berarti urutan mapping-nya belum pindah. Nggak perlu baca satu baris kode pun buat tahu fix-nya jalan atau nggak.
Sekarang: context nggak ada, handler balikin 401 "missing user context". Fail-closed. Authorization itu beda dari authentication, yang satu mastiin siapa yang login, yang lain memastikan aksi apa yang boleh dilakukan [3], dan Broken Access Control masih duduk di posisi nomor satu OWASP Top 10 [3]. Jejak aktor yang akurat bagian dari itu semua: log dan audit trail itu bahan investigasi, bukan formalitas [4]. Kalo jejak bisa keisi nol karena kecelakaan teknis, nilai forensiknya hilang tepat pas dibutuhkan. Saya lebih milih handler ini ribut (401) sekali-dua-kali daripada riwayat yang cantik tapi bohong; semangatnya mirip jaga login dev yang dulu: pintu singgah yang kelihatannya malah jadi lubang.
Subject Email yang Nggak Bisa Dipatahkan
Fix ketiga keliatan paling sepele. Subject email notifikasi membawa subjek pengajuan, teks bebas dari pengaju. Beliau-beberapa baris kode kemudian, teks itu nyemplung ke header email apa adanya. Control character kayak newline di tengah subject bisa memecah header, dan header email yang bisa dipecah itu pintu klasik header injection.
Sekarang subject melewati satu fungsi sanitasi kecil: buang semua control character, karakter non-cetak yang termasuk newline, carriage return, sampai DEL. Satu tempat untuk semua subject yang membawa teks bebas pengaju, sementara body HTML udah di-escape di jalurnya sendiri. Efek samping yang saya suka: kebiasaan nulis sanitizer terpusat ini bikin subject berikutnya tinggal lewat jalur yang sama, nggak ada yang nulis escaping versi sendiri.
Tiga perbaikan ini totalnya puluhan baris. Tapi temanya satu: sistem yang jawabnya bisa dipercaya. Error yang nyambung sama penyebabnya, aktor yang nggak bisa jadi nol karena kecelakaan, dan notifikasi yang nggak bisa dipatah sama isi form. Detail-detail kayak gini nggak pernah kelihatan di demo, tapi dia yang menentukan jam tiga pagi milik siapa.
Sumber