Dasar-Dasar Secure Coding
Bangun kebiasaan menulis kode yang aman sejak awal: validasi input, penanganan rahasia, manajemen dependensi, dan peninjauan kode berorientasi keamanan.
Tujuan Pembelajaran
- Menerapkan prinsip validasi input dan pengodean output
- Mengelola rahasia seperti kunci API dan kata sandi dengan aman
- Memahami risiko dependensi dan rantai pasok perangkat lunak
- Mengintegrasikan keamanan ke dalam peninjauan kode dan pipeline CI
01Mindset: keamanan sejak desain
Secure coding berarti keamanan dipikirkan selama pengembangan, bukan ditambahkan sesudahnya. Memperbaiki kerentanan setelah rilis jauh lebih mahal dibanding mencegahnya saat menulis kode.
Prinsip yang menuntun keputusan: least privilege, fail secure (gagal ke kondisi aman), defense in depth, dan jangan percaya input apa pun dari luar batas kepercayaan sistem.
02Input, output, dan penanganan galat
Tiga kebiasaan ini menutup sebagian besar kerentanan umum.
- Validasi input dengan allowlist: periksa tipe, panjang, rentang, dan format di server
- Gunakan parameterized query dan encoding output sesuai konteks
- Tangani galat dengan pesan umum untuk pengguna, dan catat detailnya di log internal
- Hindari menjalankan perintah sistem dengan input pengguna; gunakan API yang aman bila perlu
- Batasi ukuran dan jenis berkas unggahan, dan simpan di luar direktori yang dapat dieksekusi
03Mengelola rahasia
Kunci API, token, dan kata sandi basis data tidak boleh ditulis di dalam kode atau dikirim ke repositori. Repositori sering dibagikan, dan riwayat Git menyimpan semuanya, termasuk rahasia yang sudah dihapus belakangan.
Simpan rahasia di variabel lingkungan atau layanan secret manager, batasi hak tiap kunci, rotasi secara berkala, dan segera cabut serta ganti bila sempat bocor. Pindai repositori dengan alat pendeteksi rahasia.
04Dependensi dan rantai pasok
Aplikasi modern sebagian besar terdiri dari pustaka pihak ketiga. Kerentanan pada satu pustaka dapat mengenai ribuan aplikasi.
- Kunci versi dependensi dengan lockfile dan periksa secara rutin
- Gunakan alat seperti npm audit atau Dependabot untuk memantau kerentanan
- Pilih pustaka yang dirawat aktif dan hindari menambah dependensi yang tidak perlu
- Pertimbangkan SBOM (daftar komponen perangkat lunak) untuk transparansi
05Peninjauan kode dan otomatisasi
Peninjauan kode oleh rekan membantu menemukan kesalahan logika dan akses yang tidak terlihat oleh penulisnya. Gunakan daftar periksa keamanan agar peninjauan konsisten.
Otomatiskan pemeriksaan di pipeline CI: analisis statis (SAST), pemindaian dependensi, dan deteksi rahasia, sehingga masalah umum tertangkap sebelum penggabungan kode.
Contoh Praktis (Aman)
Validasi allowlist dan rahasia dari environmentContoh defensif di Node.js dengan pustaka zod untuk validasi, serta pemuatan rahasia dari environment yang gagal dengan aman bila tidak tersedia.
import { z } from 'zod';
// Validasi input di server dengan skema allowlist
const skemaDaftar = z.object({
email: z.string().email().max(120),
umur: z.number().int().min(13).max(120),
peran: z.enum(['siswa', 'guru'])
});
app.post('/daftar', (req, res) => {
const hasil = skemaDaftar.safeParse(req.body);
if (!hasil.success) {
return res.status(400).json({ error: 'Input tidak valid' });
}
// lanjut dengan hasil.data yang sudah tervalidasi
});
// Rahasia dari environment; gagal aman bila tidak ada
const kunciApi = process.env.API_KEY;
if (!kunciApi) {
throw new Error('API_KEY belum dikonfigurasi');
}Rangkuman
- Pikirkan keamanan sejak desain dengan prinsip least privilege, fail secure, dan defense in depth
- Validasi input dengan allowlist di server dan encoding output sesuai konteks
- Jangan simpan rahasia di kode; gunakan environment atau secret manager dan rotasi berkala
- Kelola dependensi dengan lockfile, audit rutin, dan otomatisasi SAST di pipeline CI
Mini Quiz
Pilih satu jawaban untuk setiap soal, lalu tekan "Periksa Jawaban".
Di mana sebaiknya kunci API disimpan?
Pendekatan validasi input yang dianjurkan adalah...
Mengapa alat seperti npm audit atau Dependabot berguna?