SQL Injection adalah salah satu serangan web paling berbahaya dan paling umum. Penyerang menyisipkan kode SQL lewat input untuk mencuri, mengubah, atau menghapus data. Artikel ini membahas cara mencegah SQL injection di PHP secara menyeluruh.

Apa Itu SQL Injection?
Bayangkan query login yang rentan seperti ini:
<?php // KODE BERBAHAYA - JANGAN DITIRU $user = $_POST["username"]; $query = "SELECT * FROM users WHERE username = '$user'"; ?>
Jika penyerang mengetik ' OR '1'='1 sebagai username, query menjadi selalu benar — ia bisa login tanpa password, atau bahkan menghapus tabel. Inilah SQL injection.
Solusi Utama: Prepared Statement
Prepared statement memisahkan perintah SQL dari data, sehingga input pengguna tidak pernah dianggap sebagai perintah. Ini pertahanan terkuat:
<?php
// AMAN dengan mysqli
$stmt = $koneksi->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param("s", $_POST["username"]);
$stmt->execute();
$hasil = $stmt->get_result();
?>
Tanda ? adalah placeholder, dan bind_param mengisinya dengan aman. Sekarang ' OR '1'='1 hanya dianggap teks biasa.
Versi PDO
<?php
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :user");
$stmt->execute(["user" => $_POST["username"]]);
$user = $stmt->fetch();
?>
Untuk Angka: Paksa Tipe Data
Bila memakai nilai di query tanpa prepared statement (mis. id di URL), paksa jadi integer:
<?php
$id = (int) $_GET["id"];
$koneksi->query("SELECT * FROM produk WHERE id = $id"); // aman karena (int)
?>
Praktik Keamanan Database Lainnya
- Jangan pakai user root di produksi; buat user database dengan hak terbatas.
- Jangan tampilkan pesan error SQL ke publik (matikan
display_errors). - Validasi input (tipe, panjang) sebelum diproses.
- Batasi hak akun database hanya yang diperlukan.
Kesalahan Umum
- Mengira
mysqli_real_escape_stringcukup — prepared statement jauh lebih aman dan disarankan. - Prepared statement untuk sebagian, string untuk sebagian — satu celah saja sudah cukup bagi penyerang. Konsisten pakai prepared statement.
Kesimpulan
Cara utama mencegah SQL injection di PHP adalah selalu memakai prepared statement dengan bind_param untuk setiap input, dan memaksa tipe integer untuk angka. Ini bukan opsional — ini standar wajib keamanan aplikasi web.
Referensi: untuk pendalaman, kunjungi panduan keamanan resmi PHP.

