
SQL Injection: Cara Kerja, Contoh & Pencegahan
SQL Injection tetap menjadi salah satu kerentanan paling berbahaya pada aplikasi web. Serangan ini memungkinkan penyerang mengubah query database hanya dengan memasukkan string khusus pada form login, parameter URL, atau input lain yang tidak disanitasi. Bagi web developer, mahasiswa IT, dan penggemar keamanan siber di Indonesia, memahami mekanisme, contoh nyata, serta perbaikan kode menjadi kewajiban.
Apa Itu SQL Injection dan Mengapa Masih Berbahaya
SQL Injection (SQLi) terjadi ketika aplikasi menggabungkan data pengguna langsung ke dalam string query SQL tanpa pemisahan yang jelas. Database kemudian mengeksekusi perintah yang sudah diubah oleh penyerang. Dampaknya bisa mulai dari pencurian data login hingga penghapusan seluruh tabel.
Menurut daftar OWASP Top 10, injection (termasuk SQL Injection) masih menempati posisi tinggi karena banyak aplikasi legacy dan kode cepat yang masih memakai query dinamis. Penyerang hanya butuh satu titik input yang tidak aman untuk mengambil kendali.
Cara Kerja SQL Injection Secara Teknis
Cara kerja SQL Injection dimulai dari input yang diterima aplikasi. Aplikasi membangun query dengan menggabungkan string. Contoh query login klasik:
SQL
SELECT * FROM users WHERE username = 'input_user' AND password = 'input_pass'
Jika input_user diisi ‘ OR ‘1’=’1 dan password diisi apa saja, query menjadi:
SQL
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '...'
Kondisi ‘1’=’1 selalu benar sehingga baris pertama dikembalikan. Penyerang berhasil masuk tanpa password yang valid.
Ada beberapa varian:
- In-band (hasil langsung tampil di halaman)
- Blind (berdasarkan benar/salah atau waktu delay)
- Out-of-band (data dikirim lewat channel lain)
Semua bergantung pada error handling dan konfigurasi database.
Contoh SQL Injection di Kode PHP Vulnerable
Berikut contoh kode PHP yang rentan (vulnerable code):
PHP
<?php
$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($conn, $query);
if (mysqli_num_rows($result) > 0) {
echo "Login berhasil";
} else {
echo "Login gagal";
}
?>
Payload sederhana pada kolom username:
text
' OR 1=1 --
Query yang dijalankan:
SQL
SELECT * FROM users WHERE username = '' OR 1=1 --' AND password = '...'
Komentar — memotong sisa query. Hasilnya: autentikasi berhasil tanpa kredensial benar.
Contoh lain untuk mengekstrak data:
text
' UNION SELECT username, password FROM users --
Jika aplikasi menampilkan hasil query, data sensitif langsung terbaca.

Cara Mencegah SQL Injection dengan Prepared Statement PHP PDO
Cara mencegah SQL Injection yang paling efektif adalah memisahkan data dari perintah SQL. Prepared statement melakukan itu. Di PHP, PDO menyediakan antarmuka yang bersih dan aman.
Versi aman dengan PHP PDO:
PHP
<?php
$username = $_POST['username'];
$password = $_POST['password'];
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->execute([
':username' => $username,
':password' => $password
]);
$user = $stmt->fetch();
if ($user) {
echo "Login berhasil";
} else {
echo "Login gagal";
}
?>
Placeholder :username dan :password diganti oleh driver database setelah query diparsing. Data tidak pernah dianggap sebagai bagian dari sintaks SQL. Payload ‘ OR 1=1 — hanya diperlakukan sebagai string biasa, bukan perintah.
Langkah praktis implementasi:
- Gunakan PDO, bukan mysqli prosedural.
- Selalu prepare dulu, baru execute dengan parameter.
- Set atribut error mode ke exception agar kesalahan mudah ditangkap.
- Batasi hak akses database user hanya ke tabel dan operasi yang dibutuhkan.
Selain prepared statement, lakukan sanitasi input tambahan (filter_var, whitelist karakter) dan terapkan WAF (Web Application Firewall) di depan aplikasi. WAF dapat memblokir pola payload umum sebelum mencapai kode.
Praktik Tambahan yang Memperkuat Pertahanan
- Validasi tipe data: jika kolom mengharapkan angka, paksa integer.
- Escape output: hindari menampilkan error database mentah ke pengguna.
- Logging: catat semua query gagal dan percobaan login mencurigakan.
- Update rutin: patch library dan database server.
- Least privilege: akun database aplikasi jangan punya hak DROP atau CREATE.
Kombinasi prepared statement + sanitasi input + WAF + least privilege menutup hampir semua jalur serangan SQL Injection modern.
FAQ
Bagaimana cara kerja SQL Injection pada form login?
Penyerang memasukkan string yang mengubah logika WHERE menjadi selalu benar, misalnya `’ OR ‘1’=’1`. Query mengembalikan baris valid dan login berhasil tanpa password yang benar.
Apakah SQL Injection masih bisa terjadi jika sudah memakai prepared statement?
Hampir tidak mungkin jika prepared statement dipakai dengan benar dan tidak ada dynamic query lain yang dibangun dari input. Risiko tersisa hanya jika parameter diikat secara salah atau ada second-order injection.
Apakah WAF saja cukup untuk mencegah SQL Injection?
Tidak. WAF membantu memfilter payload umum, tetapi bisa dilalui dengan encoding atau teknik lanjutan. Pertahanan utama tetap ada di kode: prepared statement dan validasi input.
SQL Injection bukan teori lama. Setiap baris query yang dibangun dari input pengguna masih menjadi titik lemah. Terapkan prepared statement PHP PDO hari ini, audit kode lama, dan biasakan prinsip “data bukan kode”.
Kunjungi kembali blog Nomatali untuk panduan keamanan web dan artikel teknis lainnya yang langsung bisa dipraktikkan.


