Marketing Service — Keamanan & Hardening
Dokumen Internal · Security baseline · diverifikasi per audit 2026-05-29 – 2026-06-05
Dokumen ini mencatat implementasi keamanan yang aktif di
services/marketing_service. Semua item di bawah telah diimplementasikan dan diverifikasi terhadap source code aktual.
Keamanan & Hardening
Semua item di bawah telah diimplementasikan dan diverifikasi per audit keamanan 2026-05-29–2026-06-05.
Autentikasi & Konfigurasi Service
-
Fail-fast pada konfigurasi kosong:
LoadConfig()diconfig.gomenghentikan proses (log.Fatal) saat startup jikaINTERNAL_NOTIFICATION_API_KEYtidak di-set di production. Tidak ada endpoint internal yang bisa aktif secara diam-diam tanpa konfigurasi kunci yang benar. -
Guard saat key middleware nil:
RegisterInternaldiroutes.gomencatatslog.Errordan tidak mendaftarkan grup endpoint/internal/*jikainternalKeybernilai nil — sehingga route operator tidak pernah aktif tanpa middleware kunci. Di production kondisi ini tidak akan tercapai karenaLoadConfig()sudahlog.Fatallebih dulu saat key kosong, jadi masalah konfigurasi terdeteksi di awal startup, bukan saat request pertama datang.
Input Validation & SQL Safety
-
Parameterisasi query penuh di UpdateScheduleStatus: Fungsi
UpdateScheduleStatusdistore_schedules.gomenggunakan positional placeholder$Ndanargsslice untuk semua nilai dinamis — termasuk klausaIN (...)yang dibangun dari positional params, bukan string concat. SQL injection via string concatenation tidak dimungkinkan. -
Validasi UUID sebelum query database: Handler
handlePostPromoClaimmemanggilisValidUUID()untuk memvalidasipromoItemIDsebelum nilai tersebut diteruskan ke query Postgres. String dengan format non-UUID (termasuk payload injection) ditolak di layer handler sebelum menyentuh database. -
Pesan error database tidak bocor ke client: Error dari layer database di-log secara internal via structured logger; HTTP response ke client hanya mengembalikan pesan generik
"operation failed". Nama tabel, nama constraint, dan detail skema internal tidak terekspos ke caller.
Reliability & Keamanan Runtime
-
Panic recovery middleware aktif:
server.gomembungkus mux denganwithRecovery()middleware — handler yang panic tidak lagi menyebabkan goroutine crash tanpa response. Setiap panic secara otomatis di-recover dan dikembalikan sebagai HTTP 500, mencegah denial-of-service tidak sengaja dari edge case handler. -
Identitas audit trail divalidasi di hulu:
created_by_user_idpada aksi schedule di-inject olehdashboard_apidari session yang sudah terverifikasi ke request body (lihat catatan M-13 dischedule_handlers.go), bukan diisi bebas oleh end-user. Marketing service memvalidasi format UUID-nya sebelum disimpan, dan/internal/*hanya bisa dipanggil oleh service ber-internal-key — bukan langsung oleh end-user. -
Batas ukuran respons halaman schedule:
handleListSchedulesmembatasi maksimum 200 item per request. Tidak ada cara bagi caller untuk melakukan dump seluruh tabelpromo_schedulesdalam satu request, baik secara disengaja maupun tidak.
Referensi
- Source service:
services/marketing_service/ - Audit sumber:
merchant_docs/docs/plans/audit/KESLES_AUDIT_CLOSE.md - Status service: marketing-service-status.md
- VM path:
/home/enalfarid/kesles_merchant/merchant_marketing/marketing-service - Port:
127.0.0.1:8095(loopback only)