Vibe Coding: Membangun Software Bersama AI dengan Aman

Belum masuk. Progresmu tidak tersimpan.

Masuk
  • Bab 5 dari 6
  • 35 menit
  • 2 latihan kode
  • 4 soal kuis

Risiko dan Keamanan Kode Buatan AI

Di bab ini (9 bagian)
  1. Tujuan
  2. Kode yang berjalan belum tentu aman
  3. Enam risiko utama
  4. Contoh: XSS di kode AI
  5. Contoh: validasi input
  6. Kebocoran rahasia
  7. Checklist keamanan sebelum rilis
  8. Kesalahan umum
  9. Rangkuman

Tujuan bab ini

  • Memahami data riset tentang keamanan kode buatan AI.
  • Mengenali enam risiko utama vibe coding.
  • Menerapkan validasi input dan escaping pada kode hasil AI.
  • Memakai checklist keamanan sebelum merilis aplikasi.

Kode yang berjalan belum tentu aman

Sampai sini kamu sudah melihat bahwa kode AI bisa jalan tetapi salah untuk kasus tertentu. Di bab ini, masalahnya lebih serius: kode AI bisa jalan dengan baik, tetapi membuka celah keamanan yang tidak terlihat. Beberapa data riset:

AngkaTemuanSumber
45%sampel kode buatan AI gagal uji keamanan OWASP Top 10Veracode GenAI Code Security Report 2025, lebih dari 100 LLM, 80 tugas coding
62%solusi kode buatan AI mengandung cacat desain atau kerentanan yang dikenalCloud Security Alliance, Juli 2025
20%aplikasi hasil vibe coding memiliki kerentanan serius atau salah konfigurasiStudi Wiz, dikutip Kaspersky

Masalahnya bukan AI menulis kode yang tidak jalan. Masalahnya, kode itu jalan dengan baik namun menyimpan celah. Dan karena vibe coding menilai hasil dengan menjalankan aplikasi, celah seperti ini tidak akan terlihat. Aplikasi yang bocor datanya tetap tampil rapi di layar.

Enam risiko utama

  1. Celah keamanan klasik. Injeksi SQL, XSS, dan input yang tidak divalidasi.
  2. Kebocoran rahasia. API key atau password tertanam langsung di kode.
  3. Aturan akses terlupa. Database terbuka karena otorisasi tidak dikonfigurasi.
  4. Utang teknis. Kode menumpuk, sulit dipahami dan dirawat.
  5. Revisi berulang. Keamanan cenderung menurun setelah banyak putaran prompt.
  6. Biaya membengkak. Pemakaian token dan layanan cloud tanpa batas.

Contoh insiden yang umum: AI membuat kode yang membaca dan menulis data ke database, tetapi tidak mengatur kebijakan akses. Hasilnya, data siapa pun bisa dibaca oleh siapa pun. Aplikasinya berfungsi sempurna saat diuji pemiliknya, karena pemiliknya memang hanya melihat datanya sendiri lewat tampilan aplikasi.

Risiko kelima juga perlu diperhatikan. Penelitian menunjukkan keamanan kode memburuk ketika direvisi berulang kali melalui prompt lanjutan. Setiap putaran "perbaiki ini" bisa saja menghapus pengecekan yang sebelumnya ada, demi membuat error hilang.

Contoh: XSS di kode AI

Misalkan kamu meminta AI menampilkan komentar pengguna. AI bisa saja menulis:

function tampilkanKomentar(nama, isi) {
  return "<p><b>" + nama + "</b>: " + isi + "</p>";
}
// hasilnya lalu dimasukkan ke halaman lewat innerHTML

Dengan input normal, semuanya terlihat baik. Tapi bagaimana kalau seseorang mengisi komentar dengan <img src=x onerror="alert(1)">? Teks itu ikut masuk sebagai HTML dan kode di dalamnya dijalankan di browser setiap pengunjung. Inilah XSS (cross-site scripting).

Perbaikannya adalah escaping: ubah karakter khusus HTML menjadi bentuk aman sebelum disisipkan.

function escapeHtml(teks) {
  return String(teks)
    .replaceAll("&", "&amp;")
    .replaceAll("<", "&lt;")
    .replaceAll(">", "&gt;")
    .replaceAll('"', "&quot;")
    .replaceAll("'", "&#39;");
}

function tampilkanKomentar(nama, isi) {
  return "<p><b>" + escapeHtml(nama) + "</b>: " + escapeHtml(isi) + "</p>";
}

Perhatikan urutannya: & harus diganti paling awal. Kalau tidak, &lt; yang baru dibuat akan berubah lagi menjadi &amp;lt;. Detail kecil seperti ini sering terlewat, baik oleh AI maupun manusia.

Contoh: validasi input

Celah klasik ketiga adalah input yang tidak divalidasi. Kode AI sering langsung memakai data dari formulir:

function buatAkun(data) {
  return { username: data.username, umur: data.umur };
}

Fungsi ini menerima username kosong, umur -5, bahkan umur berupa teks. Validasi berarti memeriksa input di batas masuk dan menolak yang tidak sesuai aturan:

function validasiAkun(data) {
  const galat = [];
  const u = typeof data.username === "string" ? data.username.trim() : "";
  if (!/^[a-z0-9_]{3,20}$/.test(u)) galat.push("username");
  if (!Number.isInteger(data.umur) || data.umur < 13 || data.umur > 120) galat.push("umur");
  return galat;
}

Fungsi mengembalikan daftar field yang bermasalah. Daftar kosong berarti input lolos. Polanya penting: periksa tipe dulu, baru isi, lalu kembalikan hasil yang jelas.

Kebocoran rahasia

Kesalahan yang sangat sering: API key ditulis langsung di kode.

// Buruk: siapa pun yang melihat kode atau repositori bisa memakai key ini
const API_KEY = "sk-rahasia-123";

// Lebih baik: diambil dari environment variable saat aplikasi berjalan
const API_KEY = process.env.API_KEY;

Kalau kode dengan key tertanam sudah di-commit dan di-push ke repositori publik, anggap key itu bocor. Menghapus barisnya di commit berikutnya tidak cukup, karena riwayat Git masih menyimpannya. Ganti key-nya di layanan terkait.

Checklist keamanan sebelum rilis

  • Rahasia disimpan di environment variable, bukan di kode.
  • Otentikasi dan aturan akses data aktif (misalnya row-level security).
  • Semua input pengguna divalidasi dan disanitasi.
  • Scanner dijalankan: SAST, audit dependensi, deteksi rahasia.
  • AI diminta meninjau kodenya sendiri untuk mencari celah.
  • Tes otomatis untuk alur penting (login, pembayaran, data).
  • Review manusia untuk bagian yang sensitif.
  • Log, pemantauan, dan rencana rollback sudah siap.

Ada trik murah tapi ampuh. Studi yang dikutip Kaspersky menemukan bahwa menambahkan instruksi umum seperti "pastikan kode mengikuti praktik keamanan terbaik" di prompt saja sudah memangkas tingkat kerentanan hingga separuhnya. Sebagian besar celah bisa dicegah dengan meminta keamanan secara eksplisit dan menjalankan pemeriksaan otomatis. Namun ingat, instruksi di prompt bukan pengganti scanner dan review. Separuh lebih sedikit tetap bukan nol.

Kesalahan umum

  • Percaya karena aplikasinya jalan. Celah keamanan tidak terlihat dari tampilan.
  • Menempel API key ke prompt atau kode lalu mem-push-nya ke repositori.
  • Merevisi berulang tanpa memeriksa ulang keamanan, padahal keamanan cenderung menurun setiap putaran.
  • Lupa membatasi biaya layanan cloud dan token.

Rangkuman

  • Riset menunjukkan porsi besar kode AI gagal uji keamanan: 45% (Veracode), 62% (CSA), dan 20% aplikasi vibe-coded punya kerentanan serius (Wiz).
  • Enam risiko utama: celah klasik, kebocoran rahasia, aturan akses terlupa, utang teknis, revisi berulang, dan biaya membengkak.
  • Escaping mencegah XSS, dan validasi input menolak data yang tidak sesuai aturan di batas masuk.
  • Rahasia disimpan di environment variable, dan key yang pernah bocor harus diganti.
  • Instruksi keamanan di prompt bisa memangkas kerentanan hingga separuh, tetapi tetap jalankan checklist, scanner, dan review.

Selesaikan bab ini

  1. 1. Baca materi
  2. 2. Latihan kode (2)
  3. 3. Kuis (4 soal)

Latihan kode: Tambal celah XSS di escapeHtml

AI menulis escapeHtml untuk menampilkan komentar pengguna, dan ia bilang fungsinya sudah aman. Ujilah klaim itu. Perbaiki fungsinya supaya:

  • semua kemunculan &, <, >, ", dan ' diganti menjadi &amp;, &lt;, &gt;, &quot;, dan &#39;;
  • & diganti paling awal agar hasil escaping tidak di-escape ulang;
  • input bukan teks (misalnya angka) diubah dulu dengan String().

Latihan kode: Lengkapi validasi input pendaftaran

Validasi buatan AI ini hanya mengecek kasus normal. Lengkapi validasiAkun(data) supaya mengembalikan array nama field yang bermasalah (array kosong berarti lolos):

  • username: harus teks; setelah dipangkas, hanya huruf kecil a-z, angka, dan _, panjang 3 sampai 20. Bila tidak, masukkan "username".
  • umur: harus bilangan bulat (bukan teks), dari 13 sampai 120. Bila tidak, masukkan "umur".
  • Urutan galat: username dulu, lalu umur. Fungsi tidak boleh error walau field tidak ada.

Cek pemahaman

  1. 1Menurut Veracode GenAI Code Security Report 2025, berapa persen sampel kode AI yang gagal uji keamanan OWASP Top 10?

  2. 2Apa hasil pemanggilan ini?

    function escapeHtml(teks) {
      return teks.replace("<", "&lt;").replace(">", "&gt;");
    }
    
    escapeHtml("<i><b>");
  3. 3Menghapus API key dari kode di commit berikutnya sudah cukup bila key itu pernah di-push ke repositori publik.

  4. 4Studi yang dikutip Kaspersky menemukan instruksi umum "pastikan kode mengikuti praktik keamanan terbaik" di prompt dapat...