CyberLearn // Learn. Explore. Secure.0
Kembali ke Pusat Belajar
Modul 20/36L2 · MenengahBelum mulai 20 menit

Konsep SQL Injection

Pahami konsep SQL injection secara defensif: mengapa terjadi, apa dampaknya, dan cara mencegahnya dengan parameterized query serta kontrol berlapis.

Tujuan Pembelajaran

  • Menjelaskan akar masalah SQL injection: data diperlakukan sebagai perintah
  • Mengenali pola kode rentan dan pola kode aman secara konseptual
  • Menerapkan parameterized query dan ORM dengan benar
  • Menambahkan kontrol pendukung: hak akses minimal, validasi, dan pemantauan

01Akar masalahnya

SQL injection terjadi ketika aplikasi menyusun perintah SQL dengan menyambung teks dari input pengguna, sehingga basis data tidak dapat membedakan mana bagian perintah yang ditulis pengembang dan mana data dari pengguna. Input yang dirancang khusus dapat mengubah makna kueri.

Dampaknya dapat serius: kebocoran data, perubahan atau penghapusan data, hingga pengambilalihan akun. Kerentanan ini sudah dikenal puluhan tahun, tetapi tetap ditemukan karena kebiasaan menyambung string masih sering terjadi.

02Pola rentan versus pola aman

Secara konseptual, perbedaannya terletak pada apakah input pengguna ikut membentuk struktur kueri atau hanya dikirim sebagai nilai terpisah.

  • Rentan: kueri dibangun dengan menyambung atau menyisipkan string dari input langsung ke teks SQL
  • Aman: kerangka kueri ditulis tetap dengan penanda posisi, dan nilai dikirim terpisah sebagai parameter
  • Dengan parameter, basis data memperlakukan input sebagai data murni, apa pun isinya

03Parameterized query dan ORM

Parameterized query (prepared statement) adalah pertahanan utama. Struktur kueri dikirim lebih dulu, lalu nilai dikirim sebagai parameter yang tidak pernah ditafsirkan sebagai SQL.

ORM modern umumnya memakai parameter secara otomatis, tetapi fitur kueri mentah di dalam ORM tetap bisa rentan jika disambung manual. Bagian yang tidak dapat diparameterkan, seperti nama kolom atau arah pengurutan, harus dipilih dari daftar nilai yang diizinkan.

04Kontrol pendukung

Parameterisasi tetap menjadi kontrol utama, tetapi pertahanan berlapis mengurangi dampak bila ada kesalahan di tempat lain.

  • Hak akses minimal: akun basis data aplikasi tidak perlu hak mengubah skema atau membaca semua tabel
  • Validasi input dengan allowlist untuk tipe, panjang, dan format
  • Pesan galat umum agar struktur basis data tidak terungkap
  • Pencatatan dan peringatan atas kueri yang tidak biasa, serta pengujian keamanan berkala

05Mendeteksi saat peninjauan kode

Saat meninjau kode, cari titik tempat teks SQL dibentuk. Setiap penyambungan string yang melibatkan variabel dari luar adalah tanda bahaya. Alat analisis statis dan pengujian keamanan aplikasi membantu menemukannya lebih awal, sebelum kode dirilis.

Contoh Praktis (Aman)

Pola rentan versus pola aman (konseptual)

Dua gaya penulisan kueri di Node.js. Contoh pertama hanya memperlihatkan polanya yang harus dihindari; contoh kedua adalah praktik yang dianjurkan.

// HINDARI: SQL dibentuk dari penyambungan teks input
// const sql = "SELECT * FROM pengguna WHERE email = '" + emailInput + "'";

// AMAN: parameterized query, nilai dikirim terpisah
const sql = 'SELECT id, nama FROM pengguna WHERE email = $1';
const hasil = await pool.query(sql, [emailInput]);

// Untuk bagian yang tidak bisa diparameterkan, pakai allowlist
const kolomBoleh = ['nama', 'dibuat_pada'];
const urut = kolomBoleh.includes(kolomInput) ? kolomInput : 'nama';

Rangkuman

  • SQL injection terjadi saat input pengguna ikut membentuk struktur perintah SQL
  • Parameterized query adalah pertahanan utama karena memisahkan perintah dari data
  • Bagian yang tidak bisa diparameterkan harus dipilih dari allowlist
  • Hak akses minimal, validasi, galat umum, dan pemantauan menjadi lapisan pendukung

Mini Quiz

Pilih satu jawaban untuk setiap soal, lalu tekan "Periksa Jawaban".

Soal 1/3

Apa akar penyebab SQL injection?

Soal 2/3

Pertahanan utama terhadap SQL injection adalah...

Soal 3/3

Bagaimana menangani nama kolom untuk pengurutan yang berasal dari input?

0/3 terjawab