Blog
Catatan teknis seputar web development, DevOps, dan integrasi AI.
500 artikel
- 00.59backend
Filter yang diam-diam kosong
Tiga kegagalan publik satu malam: filter tak pernah cocok, pencarian meledak 500, dan 403 yang memantulkan input.
TL;DR: Tiga bug publik: pencarian satu bintang bikin error 500, filter fasilitas selalu kosong, dan pesan error 403 ikut memantulkan input pengguna. Semuanya diperbaiki lewat sanitasi di batas input, pola LIKE yang cocok sama format data asli, plus pesan galat yang diamkan nilai mentah. Pelajarannya satu: jaga semuanya di tepi.
#mysql#sql#input-validation - 00.57testing
Tes yang tak bisa gagal
Assert exit code bisa dilalui jalur lain yang tidak diuji. Perbaikannya mengikat assert ke output yang diperlebar.
TL;DR: Test CLI itu cuma ngecek exit code, jadi walau fitur ekspansi dihapus, test tetap hijau alias mutannya selamat. Artinya testnya nggak bisa gagal dan lulus gara-gara jalur lain. Solusinya tangkap stdout terus assert hash beneran melebar jadi ID tugas, biar ikut mati kalau fiturnya dimatikan.
#testing#python#mutation-testing - 00.54tooling
Indeks yang diperintah sinkron: lint DONE-INDEX
Papan bilang Done, indeks tidak punya hash-nya, dan tidak ada yang protes. Perbaikannya menghapus salinan tangan.
TL;DR: Kartu Done sering nunjukin hash yang nggak ada di indeks commit karena indeksnya digambar tangan dan cuma snapshot sekali. Masalahnya bukan lalai, tapi arsitektur: dokumen yang diisi manual pasti melenceng dari kenyataan. Solusinya indeks diregenerasi otomatis dari git log plus lint yang nolak kartu Done tanpa jejak, jadi statusnya bisa diverifikasi mesin.
#git#linting#documentation - 23.42database
Jalan Mundur ke Nol: Down Migration yang Tak Pernah Dijalankan
Checkpoint v56 dibangun di atas teori yang salah. Dua bug di file down, error 1553 dan 1364, baru ketahuan saat down-to-0 dijalankan lagi.
TL;DR: Ceritanya checkpoint versi 56 yang selama ini jadi pegangan ternyata cuma teori yang nggak pernah diuji. Pas down-to-0 dicoba, dua file down kena error: satu lupa kolom slug, satu lagi buang index yang masih ditumpang FK. Solusinya, balik urutan index, perbaiki insert, terus bikin test roundtrip biar rantai migration bisa dibuktikan bolak-balik.
#database-migration#mysql#golang-migrate - 23.42database
CASCADE Terlalu Setia: Saat Hapus Akun Membawa Konten Pergi
Guard 409 di aplikasi tidak pernah menyala karena CASCADE menghapus konten lebih dulu. Migration 000067 membaliknya: RESTRICT menolak di database, guard baru bicara.
TL;DR: Hapus akun warga ternyata ikut menghabisin semua ulasan, izin, dan pengaduan tanpa peringatan, gara-gara guard aplikasi kalah cepat sama FK CASCADE di database. Solusinya ganti CASCADE jadi RESTRICT lewat migration, biar database yang nolak duluan. Sekarang hapus akun berkonten otomatis ditolak, dan guard ErrHasContent akhirnya bisa jalan dengan respons 409.
#mysql#go#security - 22.34security
Bidang Kosong Bukan Berarti Semua: Koreografi Fail-Closed
Cakupan kosong dulu dianggap ALL demi token lama. Kisah koreografi empat tahap untuk membalik middleware menjadi menolak 403 BIDANG_UNSET.
TL;DR: Dulu kalau kolom bidang kosong, sistem anggap itu akses ALL — bahaya banget, namanya failing open. Solusinya bukan cuma hapus fallback: backfill data, sensus buktiin nol baris kosong, baru middleware nolak dengan 403 BIDANG_UNSET. Sekarang deny-by-default, dua lapis pengecekan, cuma aktor sistem userID 0 yang boleh ALL.
#go#security#rbac - 22.33tooling
Satu Pintu Jejak Satu ID: Alat Audit yang Tak Bisa Dibohongi
Reviewer menemukan read() mengikuti symlink ke .git dan lint yang cocok lintas berkas. Pelajaran soal verifier yang tidak boleh bisa dibohongi.
TL;DR: Alat audit baca-saja ini nemu dua bug serius. Fungsi read() ikut symlink sehingga bisa baca .git/ sembarangan, tapi daripada ribet resolve path, mending tolak semua symlink langsung biar nggak kena TOCTOU. Terus korpus lint digabung tanpa pemisah bikin ID nyambung dua berkas, solusinya cuma nambah newline per berkas.
#python#symlink#qa - 21.24backend
Ketika Penjaga Tak Bisa Menjawab: Fail-Closed pada Hapus Media
Census pemakaian media error dulu diperlakukan sebagai boleh hapus. Kini ErrCensusUnavailable membatalkan delete: baris dan file tetap aman.
TL;DR: Dulu di KotaPortal tombol hapus media tetap jalan walau kueri sensus gagal, dianggap "tidak dipakai" alias fail-open. Sekarang dibalik jadi fail-closed: kalau error, delete dibatalkan dan client dapet 503 CENSUS_UNAVAILABLE, detail errornya dicatat di server aja. Uji lamanya dirombak biar ngunci perilaku aman ini, file dan data nggak kehapus.
#golang#error-handling#http - 21.24backend
Batas Aman Migrasi: Tes Roundtrip Berhenti di Checkpoint 56
Tes roundtrip migrasi tidak turun ke nol: rantai down patah di tengah karena ENUM hilang. Checkpoint 56 menjadi batas aman yang terkunci tes.
TL;DR: Jadi migrasi turun gak bisa sampai nol, mentok di versi 56 karena file turun 51 butuh nilai INFORMASI yang cuma ada dari migrasi 45. Buat itu tes roundtrip dikunci buat ngecek skema balik utuh di checkpoint itu. Sekalian tes devauth mastiin rute login dev hilang, 404, kecuali env development beneran.
#golang#golang-migrate#mysql