security
Catatan teknis seputar web development, DevOps, dan integrasi AI.
52 artikel
- 16.07security
Menutup Kebocoran Data di Pipeline Artikel Otomatis
Brief buat chatbot eksternal ternyata masih membawa hostname dan nama repo asli. Gerbang mekanis tiga titik yang menutupnya.
TL;DR: Gue kaget pas cek log pipeline ngirim hostname dan nama klien asli ke chatbot luar, padahal ngandelin prompt doang gak aman. Makanya gue bikin guard mekanis yang ngubah data jadi fiktif sebelum kekirim dan ngecek ketat pas push sama verify. Pake palet resmi kayak domain contoh dan IP dokumentasi cukup, soalnya cek awal nemu 7 dari 564 artikel masih bocor.
#security#prompt-injection#privacy - 15.30security
Gitleaks Crash Pas Commit Multi-File, Lahir Gerbang Supply Chain
Hook pemindai secret crash saat commit multi-file. Ternyata satu flag hilang di definisi hook, dan ujungnya CI diikat checksum.
TL;DR: Commit multi-file mendadak gagal gara-gara hook gitleaks-system crash karena lupa set pass_filenames false. Bugnya emang ada di file upstream, cuma hook golang sama docker yang bener. Akhirnya gue pindah ke hook lokal yang checksum-nya dicek plus CI cuma pake checkout yang di-pin SHA.
#github-actions#security#ci-cd - 08.57frontend
Sidebar Admin Per-Modul: Ilusi Aman di UI, Sejati di API
Menyembunyikan menu di sidebar admin bukan otorisasi. Pengalaman membangun halaman konten per-modul dengan sidebar ter-scope bidang.
TL;DR: Awalnya ngira cukup sembunyiin menu sidebar biar aman, ternyata itu cuma kosmetik doang. Soalnya cek di layout Nextjs bisa basi dan gampang dibobol lewat manipulasi URL manual. Akhirnya solusinya dobel lapis, frontend cuma buat UX, backend pakai NarrowModules yang balikin list kosong biar nggak bocorin info.
#nextjs#react#go - 06.25backend
Set Bidang User Lain: Aksi Istimewa, Bukan Field Biasa
Hanya superadmin boleh menentukan bidang user lain; default ALL bikin 19 user lama lolos migrasi tanpa terkunci.
TL;DR: Nambah kolom bidang ke users sih gampang, yang ribet tuh nentuin siapa boleh atur scope orang lain. Akhirnya diputus cuma superadmin yang boleh set bidang lewat resolveBidang, kalau admin/editor maksa kirim bakal kena 403 tapi kalau nggak kirim tetap bisa edit field lain. Default-nya dibikin ALL biar 19 user lama nggak kekunci pas deploy dan semua aman terkunci test.
#go#mysql#security - 06.25backend
Scope Pengumuman: Menulis Nilai vs Mengubah Baris
Dua fungsi otorisasi pengumuman per bidang: resolveBidang untuk nilai baru, canManage untuk baris eksisting, NULL sebagai global.
TL;DR: Dulu semua admin bebas ubah pengumuman apa aja, sekarang dibatasi per bidang biar nggak tabrakan. Dibuat dua fungsi misah, resolveBidang buat nentuin boleh nulis ke bidang apa dan canManage buat ngecek boleh ngedit baris punya siapa. Konten global ditandai NULL bukan ALL, cuma admin ALL yang bisa ngatur, dan ceknya dipasang sebelum data keubah.
#go#mysql#security - 05.04backend
Enforcement RBAC Bidang: Gerbang Middleware dan Filter IN
Enforcement scope bidang di Go: middleware di gerbang, filter IN di repository, dan subtest yang membaca seperti policy keamanan.
TL;DR: Gerbangnya dijaga middleware ResolveBidang yang nempelin scope bidang ke context abis JWT dicek, jadi handler tinggal baca aja. Di repo filternya pakai sqlx.In buat kategori dan IS NULL OR = buat announcements, route global sama CMS dipisah biar gampang diaudit. Repo sengaja fail-open kalau modul kosong, tapi tetap aman karena semua route admin wajib lewat gerbang dan dikunci subtest t.Run.
#go#mysql#security - 04.55backend
RBAC Dua Sumbu: Role untuk Aksi, Bidang untuk Data
Role menentukan aksi, bidang menentukan data. Catatan implementasi scope resolver fail-closed di Go: ModulesFor, ResolveBidang, dan jebakan NULL.
TL;DR: Portal lintas dinas bikin pusing karena role admin doang nggak cukup buat batasin data per bidang. Akhirnya misahin konsepnya, role buat aksi dan kolom bidang buat filter data biar nggak meledak aturan izinnya. Sistemnya dibikin fail-closed jadi kalau bidang nggak dikenal ya nggak dapet data apa pun, aman deh.
#go#mysql#security - 08.55security
Gerbang Redaksi Mekanis Sebelum Publish
Style guide kepotong diam-diam di 9000 karakter. Solusinya bukan niat baik, tapi gerbang mekanis yang menyaring IP dan token di artefak final.
TL;DR: Style guide ternyata kepotong di 9000 karakter, jadi aturan redaksi pencegah bocor IP dan kredensial nggak pernah nyampe ke model. Solusinya: guide di-load utuh plus gerbang mekanis check_redaction di verify yang nge-scan semua IP dan token di artikel final. Pelajarannya, validasi artefaknya bukan niat penulisnya, soalnya false positive cuma makan lima menit, kebocoran yang keindeks itu permanen.
#security#tooling#ci - 09.43ai
Instruksi tersembunyi di file media tetap data, bukan perintah
Pipeline ingest media wajib membawa kalimat pembajakan verbatim sebagai data. Justru itulah bukti file tidak pernah bertindak jadi perintah.
TL;DR: Tengah malam penulis ngetes pipeline ingest media pake audio sintesis sendiri yang isinya perintah injeksi prompt. Alih-alih dibuang, kalimat berbahayanya justru wajib utuh di transkrip dan dilabel untrusted, soalnya bahayanya bukan teksnya, tapi waktu teks berubah jadi instruksi. Model transkripsinya dibikin stub aja, yang diuji kontrak datanya, dibuktikan lewat asersi.
#prompt-injection#llm-security#whisper