Cara Mencegah SQL Injection: Panduan Teknis & Implementasi Aman

Prinsip Utama Pencegahan SQL Injection

SQL Injection (SQLi) terjadi ketika input pengguna yang tidak terfilter digabungkan langsung ke dalam kueri database. Pencegahan mutlak dilakukan dengan memisahkan kode SQL dari data input. Metode paling efektif adalah menggunakan Prepared Statements (dengan Parameterized Queries), yang memastikan database memperlakukan input pengguna hanya sebagai data, bukan sebagai perintah eksekusi.

Metode Pencegahan Standar Industri

MetodeMekanisme KerjaTingkat Keamanan
Prepared StatementsMemisahkan struktur kueri dari data inputSangat Tinggi
Stored ProceduresMenjalankan logika di sisi databaseTinggi
Input ValidationMemastikan format data sesuai (Whitelist)Menengah
EscapingMenghapus karakter berbahayaRendah (Tidak Disarankan)

Implementasi Teknis (Contoh Kode)

Berikut adalah perbandingan antara kode rentan dan kode aman menggunakan PHP PDO.

Kode Rentan (Jangan Gunakan)

$sql = "SELECT * FROM users WHERE username = '" . $_POST['user'] . "'";
$result = $conn->query($sql);

Kode Aman (Prepared Statement)

$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username');
$stmt->execute(['username' => $_POST['user']]);
$user = $stmt->fetch();

Langkah Mitigasi Tambahan

  • Prinsip Least Privilege: Akun database yang digunakan aplikasi web hanya boleh memiliki akses terbatas (misal: tidak boleh melakukan DROP TABLE atau akses ke tabel sistem).
  • Validasi Input (Whitelist): Jika input berupa angka, pastikan tipe datanya integer. Jika berupa email, gunakan filter validasi email yang ketat.
  • Web Application Firewall (WAF): Gunakan WAF seperti ModSecurity atau layanan cloud (Cloudflare) untuk mendeteksi pola serangan SQLi sebelum mencapai server.
  • Penyembunyian Error: Jangan pernah menampilkan pesan error database (seperti syntax error) kepada pengguna akhir, karena informasi ini membantu penyerang memetakan struktur database.

Matriks Keamanan Database

FiturPentingnyaTindakan
ParameterizationKritisWajib di semua kueri
EscapingOpsionalHanya jika parameterization tidak mungkin
Error HandlingPentingMatikan display_errors di produksi
Database UserPentingGunakan user dengan hak akses minimal

Selalu perbarui pustaka (library) dan framework yang digunakan, karena banyak framework modern (seperti Laravel, Django, atau Spring) sudah memiliki mekanisme perlindungan SQLi bawaan (ORM) yang secara otomatis menggunakan parameterized queries.