28 September 2026 FMKelana

SQL Injection: Cara Hacker Membobol Database Anda dan Cara Mencegahnya

#cybersecurity #untuk #developer #web #tutorial #indonesia

SQL Injection: Cara Hacker Membobol Database Anda dan Cara Mencegahnya

Salah satu celah keamanan paling klasik namun masih sangat sering ditemukan pada aplikasi web modern adalah SQL Injection (SQLi). Berdasarkan laporan OWASP Top 10, injection masih menjadi salah satu risiko tertinggi yang mengancam aplikasi web. Bagi developer pemula, memahami cara kerja celah ini adalah langkah pertama yang wajib dilakukan sebelum menulis kode yang berinteraksi dengan database.

Pendahuluan: Apa Itu SQL Injection?

SQL Injection adalah teknik eksploitasi di mana penyerang menyisipkan perintah SQL berbahaya ke dalam input pengguna yang kemudian dieksekusi langsung oleh database. Celah ini muncul ketika aplikasi menggabungkan input pengguna ke dalam query SQL tanpa sanitasi atau parameterisasi yang benar.

Bayangkan Anda memiliki halaman login yang memeriksa username dan password dengan query seperti ini:

SELECT * FROM users WHERE username = '$username' AND password = '$password';

Jika input pengguna dimasukkan langsung ke string tersebut, penyerang dapat memanipulasi logika query sesuai keinginannya.

Pembahasan: Bagaimana Celah Ini Terjadi?

Akar masalahnya adalah string concatenation. Database tidak bisa membedakan mana bagian query yang asli dan mana yang berasal dari input pengguna. Akibatnya, ketika penyerang memasukkan karakter khusus seperti tanda kutip tunggal ('), struktur query bisa berubah total.

Kerentanan ini biasanya muncul di tiga tempat: form login, parameter URL (?id=1), dan endpoint API yang menerima JSON lalu memasukkannya langsung ke query.

Contoh Implementasi: Kode Rentan vs Aman

1. Kode Rentan (Vulnerable)

app.post('/login', (req, res) => {
  const { username, password } = req.body;
  const query = `SELECT * FROM users WHERE username = '${username}' AND password = '${password}'`;
  db.query(query, (err, result) => {
    if (result.length > 0) res.send('Login berhasil');
    else res.send('Login gagal');
  });
});

Demonstrasi eksploitasi: penyerang mengirim username = admin' -- dan password apa saja. Query yang terbentuk menjadi:

SELECT * FROM users WHERE username = 'admin' --' AND password = 'xxx';

Karakter -- menjadikan sisa query sebagai komentar, sehingga pengecekan password dilewati sepenuhnya. Penyerang berhasil login sebagai admin tanpa mengetahui passwordnya.

2. Kode Aman (Parameterized Query)

app.post('/login', (req, res) => {
  const { username, password } = req.body;
  const query = 'SELECT * FROM users WHERE username = ? AND password = ?';
  db.query(query, [username, password], (err, result) => {
    if (result.length > 0) res.send('Login berhasil');
    else res.send('Login gagal');
  });
});

Dengan parameterized query, driver database mengirim nilai secara terpisah dari struktur query. Input pengguna tidak akan pernah dieksekusi sebagai bagian dari perintah SQL, sehingga teknik komentar dan manipulasi struktur menjadi tidak efektif.

Analisis Keamanan

  • Impact: Penyerang bisa membaca seluruh data sensitif, memodifikasi, atau bahkan menghapus database (DROP TABLE).
  • Blind SQLi: Jika pesan error disembunyikan, penyerang tetap bisa mengekstrak data dengan teknik boolean atau time-based.
  • Privilege Escalation: Jika akun database memiliki hak penuh, penyerang bisa mengambil alih server melalui fitur seperti xp_cmdshell pada SQL Server.
  • Root cause: Kurangnya pemisahan antara data dan kode dalam query, ditambah tidak adanya validasi input.

Cara Pencegahan

Berikut langkah mitigasi yang bisa langsung diterapkan:

  • Gunakan Parameterized Query atau Prepared Statement di semua titik yang berinteraksi dengan database. Hindari string concatenation, apapun alasannya.
  • Manfaatkan ORM seperti Sequelize, Prisma, atau TypeORM yang secara default menggunakan parameter binding.
  • Validasi input dengan library seperti joi atau zod untuk memastikan tipe data dan format sesuai ekspektasi.
  • Terapkan prinsip Least Privilege — akun database aplikasi tidak perlu hak DROP atau GRANT.
  • Nonaktifkan pesan error detail di production agar penyerang tidak mendapat bocoran struktur database.
  • Gunakan Web Application Firewall (WAF) sebagai lapisan pertahanan tambahan.
  • Lakukan security testing secara rutin, misalnya dengan sqlmap pada lingkungan staging.

Kesimpulan

SQL Injection bukan sekadar teori lama yang sudah usang. Ia masih menjadi penyebab utama kebocoran data di banyak organisasi, mulai dari startup hingga perusahaan besar. Kunci pertahanan utamanya sederhana: jangan pernah mempercayai input pengguna dan selalu pisahkan data dari perintah SQL melalui parameterized query. Mulailah dari hal kecil seperti mengganti kode string concatenation di aplikasi Anda hari ini, terapkan validasi input, dan batasi hak akses akun database. Dengan disiplin menulis kode yang aman sejak awal, Anda tidak hanya melindungi data pengguna, tetapi juga reputasi dan kelangsungan bisnis Anda.

Bagikan:

Artikel Terkait

Komentar (0)

Belum ada komentar. Jadilah yang pertama!

Tinggalkan Komentar