Cara Mencegah SQL Injection di PHP (Panduan Lengkap)

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.

Cara Kerja Prepared Statement
Cara Kerja Prepared Statement

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_string cukup — 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.

Baca Juga

Ali Akbar

Software Developer yang fokus mengembangkan aplikasi berbasis Web dan Desktop. Senang mempelajari teknologi baru terutama di bidang web design dan web development.

View all posts by Ali Akbar →

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *