MySQL dan SQL

Apa Itu SQL Injection? Cara Kerja, Contoh Serangan, dan Cara Mencegahnya

09 November 2026 Ditulis oleh Admin Artikel & Tutorial

Keamanan database merupakan salah satu aspek penting dalam pengembangan aplikasi berbasis web. Aplikasi yang menggunakan database untuk menyimpan informasi pengguna, transaksi, maupun data penting lainnya harus memiliki sistem keamanan yang baik.

Salah satu ancaman keamanan yang perlu diperhatikan oleh developer adalah SQL Injection. SQL Injection merupakan teknik serangan yang memanfaatkan kelemahan pada proses pengolahan input pengguna untuk memanipulasi perintah SQL yang dijalankan oleh aplikasi.

Jika aplikasi tidak memiliki perlindungan yang tepat, penyerang berpotensi membaca data yang tidak seharusnya diakses, melewati mekanisme autentikasi, bahkan mengubah atau menghapus informasi dalam database.

Masalah ini sering berkaitan dengan cara aplikasi menyusun query SQL menggunakan input yang berasal dari pengguna tanpa validasi dan pemisahan parameter yang benar.

Pada artikel ini, kita akan mempelajari pengertian SQL Injection, bagaimana cara kerjanya, contoh query yang rentan, serta cara mencegahnya menggunakan Prepared Statements pada PHP dan MySQL.

1. Apa Itu SQL Injection?

SQL Injection adalah jenis serangan keamanan aplikasi yang terjadi ketika input pengguna dapat memengaruhi struktur perintah SQL yang dijalankan oleh database.

Serangan ini biasanya memanfaatkan aplikasi yang menggabungkan input pengguna secara langsung ke dalam query SQL tanpa mekanisme pemisahan parameter yang aman.

Sebagai contoh, sebuah aplikasi memiliki halaman login dengan dua input, yaitu username dan password. Ketika pengguna memasukkan informasi login, aplikasi akan menjalankan query untuk memeriksa apakah akun tersebut tersedia di database. Jika query dibuat dengan cara yang tidak aman, input tertentu dapat mengubah logika SQL yang seharusnya dijalankan. Akibatnya, database dapat memproses perintah yang berbeda dari tujuan awal aplikasi.

SQL Injection dapat menjadi ancaman serius karena database sering menyimpan informasi penting, seperti:

  • Username dan password pengguna.
  • Alamat email dan nomor telepon.
  • Informasi pelanggan.
  • Data transaksi dan pembayaran.
  • Informasi administrasi.
  • Data pribadi yang bersifat sensitif.

Oleh karena itu, setiap aplikasi yang menggunakan database perlu menerapkan perlindungan terhadap SQL Injection.

2. Bagaimana Cara Kerja SQL Injection?

Untuk memahami cara kerja SQL Injection, kita perlu mengetahui bagaimana aplikasi berkomunikasi dengan database. Secara umum, proses login pada aplikasi berbasis PHP dan MySQL berlangsung melalui beberapa tahapan:

  1. Pengguna memasukkan username dan password.
  2. Aplikasi menerima input dari pengguna.
  3. PHP menyusun query SQL.
  4. Query dikirimkan ke database MySQL.
  5. MySQL memproses query.
  6. Aplikasi menerima hasil dan menentukan apakah login berhasil atau gagal.

Permasalahan muncul ketika input pengguna langsung digabungkan ke dalam query SQL sebagai bagian dari sintaks perintah. Dengan kondisi tersebut, input yang seharusnya diperlakukan sebagai data dapat berubah menjadi bagian dari logika SQL.

Contoh Ilustrasi

Misalnya, aplikasi menggunakan query login berikut:

SELECT *
FROM users
WHERE username = 'andi'
AND password = '12345';

Query tersebut digunakan untuk mencari akun dengan username dan password tertentu. Pada implementasi yang rentan, input pengguna dapat digabungkan langsung ke dalam query.

Jika input tidak dipisahkan dari struktur SQL, penyerang dapat mencoba memasukkan karakter atau ekspresi SQL yang mengubah kondisi pencarian.

Hal tersebut dapat menyebabkan aplikasi menjalankan query yang tidak sesuai dengan tujuan awal.

Intinya: SQL Injection terjadi ketika aplikasi tidak membedakan secara aman antara perintah SQL dan data yang dimasukkan pengguna.

3. Contoh SQL Injection pada Aplikasi Login

Untuk memahami permasalahannya, kita akan melihat contoh implementasi login yang rentan. Contoh berikut hanya digunakan untuk memahami risiko keamanan pada aplikasi pengujian lokal.

A. Contoh Query Login yang Tidak Aman

Misalnya, aplikasi PHP menggunakan kode berikut:

<?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";
}
?>

Pada kode tersebut, nilai username dan password langsung dimasukkan ke dalam query SQL. Masalahnya, input pengguna menjadi bagian dari teks perintah SQL yang dikirimkan ke database.

Jika input mengandung karakter khusus yang memengaruhi sintaks query, struktur perintah SQL dapat berubah.

B. Mengapa Kode Tersebut Berbahaya?

Terdapat beberapa kelemahan pada implementasi tersebut:

  1. Input pengguna langsung digabungkan dengan query.
  2. Tidak terdapat pemisahan antara data dan struktur perintah SQL.
  3. Tidak ada mekanisme Prepared Statements.
  4. Password dibandingkan secara langsung tanpa mekanisme penyimpanan password yang aman.

Kombinasi kelemahan tersebut dapat meningkatkan risiko serangan terhadap aplikasi. Selain itu, menyimpan password dalam bentuk teks biasa juga berbahaya karena jika database berhasil diakses pihak yang tidak berwenang, password pengguna dapat langsung terbaca.

4. Dampak SQL Injection terhadap Database

SQL Injection dapat menimbulkan berbagai dampak terhadap keamanan aplikasi dan informasi yang tersimpan di dalam database. Berikut beberapa dampak yang perlu diketahui.

A. Pencurian Data Pengguna

Penyerang dapat mencoba membaca informasi yang seharusnya hanya dapat diakses oleh pengguna atau administrator tertentu. Contohnya adalah data pelanggan, alamat email, dan informasi akun.

B. Melewati Proses Autentikasi

Jika sistem login memiliki query yang rentan, penyerang dapat mencoba memanipulasi kondisi autentikasi. Hal ini berpotensi menyebabkan akses tanpa izin ke dalam aplikasi.

C. Mengubah Data Database

Pada kondisi tertentu, SQL Injection dapat dimanfaatkan untuk memodifikasi informasi yang tersimpan dalam database. Misalnya, mengubah data pengguna, informasi produk, atau catatan transaksi.

D. Menghapus Data

Jika aplikasi memberikan hak akses database yang terlalu luas, query berbahaya dapat berpotensi digunakan untuk menghapus informasi. Dampaknya bisa sangat serius, terutama jika aplikasi tidak memiliki backup yang memadai.

E. Mengakses Informasi yang Seharusnya Terbatas

SQL Injection juga dapat dimanfaatkan untuk mencoba mengakses tabel atau informasi yang seharusnya tidak dapat dijangkau oleh pengguna biasa. Karena itu, keamanan database tidak cukup hanya mengandalkan validasi input.

5. Cara Mencegah SQL Injection

Ada beberapa metode yang dapat diterapkan untuk melindungi aplikasi dari SQL Injection. Salah satu cara paling penting adalah menggunakan Prepared Statements.

Selain itu, developer juga perlu menerapkan validasi input, pembatasan hak akses database, dan pengamanan informasi autentikasi.

A. Menggunakan Prepared Statements

Prepared Statements merupakan mekanisme yang memisahkan struktur perintah SQL dari nilai parameter yang diberikan pengguna. Dengan cara ini, input pengguna diperlakukan sebagai data, bukan sebagai bagian dari sintaks SQL. Prepared Statements tersedia pada MySQLi maupun PDO.

Contoh Prepared Statements Menggunakan MySQLi

Berikut contoh implementasi login menggunakan MySQLi.

<?php
$username = $_POST['username'];
$password = $_POST['password'];

$stmt = $conn->prepare(
    "SELECT id, username, password
     FROM users
     WHERE username = ?"
);

$stmt->bind_param("s", $username);
$stmt->execute();
$result = $stmt->get_result();
$user = $result->fetch_assoc();

if ($user && password_verify($password, $user['password'])) {
    echo "Login berhasil";
} else {
    echo "Username atau password salah";
}

$stmt->close();
?>

Penjelasan:

  • $conn->prepare() digunakan untuk menyiapkan query.
  • Tanda ? merupakan placeholder untuk parameter.
  • bind_param() mengikat nilai input ke placeholder.
  • execute() menjalankan query.
  • password_verify() digunakan untuk memverifikasi password terhadap hash yang tersimpan.

Dengan menggunakan Prepared Statements, nilai username tidak digabungkan secara langsung ke dalam struktur SQL. Contoh tersebut mengasumsikan kolom password sudah menyimpan hash yang dibuat menggunakan password_hash().

Contoh Prepared Statements Menggunakan PDO

Selain MySQLi, kita juga dapat menggunakan PDO (PHP Data Objects). Contoh implementasi:

<?php
$username = $_POST['username'];
$password = $_POST['password'];

$stmt = $pdo->prepare(
    "SELECT id, username, password
     FROM users
     WHERE username = :username"
);

$stmt->execute([
    'username' => $username
]);

$user = $stmt->fetch(PDO::FETCH_ASSOC);

if ($user && password_verify($password, $user['password'])) {
    echo "Login berhasil";
} else {
    echo "Username atau password salah";
}
?>

Pada contoh tersebut:

  • $pdo->prepare() menyiapkan query SQL.
  • :username merupakan placeholder bernama.
  • execute() mengirimkan parameter ke query.
  • fetch() mengambil hasil pencarian.
  • password_verify() memeriksa kecocokan password.

Baik MySQLi maupun PDO dapat digunakan untuk mencegah SQL Injection ketika Prepared Statements diterapkan dengan benar.

B. Melakukan Validasi Input Pengguna

Selain Prepared Statements, aplikasi juga perlu melakukan validasi input. Contohnya, jika sebuah kolom hanya menerima ID numerik, aplikasi dapat memastikan bahwa nilai yang diterima benar-benar berupa angka.

Contoh:

<?php
$id = filter_input(
    INPUT_GET,
    'id',
    FILTER_VALIDATE_INT
);

if ($id === false || $id === null) {
    exit("ID tidak valid");
}
?>

Validasi tersebut membantu memastikan data sesuai dengan format yang diharapkan aplikasi. Namun, validasi input bukan pengganti Prepared Statements. Keduanya memiliki fungsi yang berbeda dan sebaiknya digunakan bersama.

C. Menggunakan Password Hashing

Password pengguna sebaiknya tidak disimpan dalam bentuk teks biasa. PHP menyediakan fungsi password_hash() untuk membuat hash password.

Contoh:

<?php
$password = "password123";

$hash = password_hash(
    $password,
    PASSWORD_DEFAULT
);

echo $hash;
?>

Ketika pengguna login, gunakan password_verify() untuk memeriksa password yang dimasukkan.

<?php
if (password_verify($password, $hash)) {
    echo "Password benar";
} else {
    echo "Password salah";
}
?>

Dengan demikian, aplikasi tidak perlu menyimpan password asli pengguna di database.

D. Membatasi Hak Akses Database

Jangan menggunakan akun database dengan hak akses administrator untuk seluruh kebutuhan aplikasi. Buat akun khusus yang hanya memiliki hak akses sesuai kebutuhan.

Contohnya, aplikasi yang hanya perlu membaca dan mengubah data tertentu tidak harus diberikan hak akses untuk menghapus database atau membuat akun baru. Pembatasan hak akses dapat mengurangi dampak jika aplikasi berhasil diserang.

E. Menghindari Menampilkan Pesan Error Database Secara Detail

Pesan error database yang terlalu lengkap dapat memberikan informasi teknis kepada pihak yang tidak berwenang.

Contohnya:

  • Nama tabel database.
  • Struktur kolom.
  • Informasi query SQL.
  • Lokasi file aplikasi.
  • Konfigurasi database.

Pada lingkungan produksi, tampilkan pesan kesalahan yang umum kepada pengguna dan simpan detail teknis pada log internal yang terlindungi.

F. Memperbarui Sistem dan Library

Pastikan PHP, MySQL, framework, dan library yang digunakan selalu mendapatkan pembaruan keamanan. Pembaruan sistem dapat membantu memperbaiki kerentanan yang ditemukan pada versi sebelumnya.

6. Perbandingan Query SQL Tidak Aman dan Prepared Statements

Agar lebih mudah dipahami, berikut perbandingan dua pendekatan dalam menyusun query SQL.

Geser tabel
Aspek Query Tidak Aman Prepared Statements
Pengolahan input Digabung langsung ke query Dipisahkan sebagai parameter
Risiko SQL Injection Tinggi jika input tidak ditangani dengan benar Jauh lebih aman untuk parameter nilai
Struktur query Dapat terpengaruh input Struktur query dipisahkan dari nilai
Rekomendasi Hindari Gunakan

Contoh query tidak aman:

$query = "SELECT * FROM users
          WHERE username = '$username'";

Contoh query menggunakan Prepared Statements:

$stmt = $conn->prepare(
    "SELECT * FROM users WHERE username = ?"
);

$stmt->bind_param("s", $username);
$stmt->execute();

Perbedaannya terletak pada cara input diproses oleh aplikasi dan database.

Prepared Statements merupakan salah satu pertahanan utama terhadap SQL Injection, tetapi tetap perlu dikombinasikan dengan pengelolaan hak akses, validasi input, dan praktik keamanan lainnya.

7. Apakah Validasi Input Saja Cukup untuk Mencegah SQL Injection?

Tidak. Validasi input memang penting, tetapi tidak cukup jika aplikasi masih menyusun query menggunakan penggabungan string secara langsung.

Misalnya, aplikasi hanya mengizinkan input berupa huruf dan angka. Pendekatan tersebut tetap bukan pengganti mekanisme pemisahan parameter.

Developer sebaiknya menggunakan Prepared Statements sebagai dasar perlindungan terhadap SQL Injection.

Validasi input digunakan untuk memastikan data sesuai dengan kebutuhan aplikasi, sedangkan Prepared Statements melindungi struktur query dari manipulasi nilai parameter.

Keduanya perlu diterapkan secara bersamaan.

8. Praktik Keamanan Database yang Perlu Diterapkan Developer

Selain mencegah SQL Injection, terdapat beberapa kebiasaan yang perlu diterapkan ketika mengembangkan aplikasi berbasis database.

  1. Gunakan Prepared Statements pada seluruh query yang menerima input pengguna.
  2. Terapkan validasi pada setiap input sesuai kebutuhan aplikasi.
  3. Simpan password menggunakan hashing yang aman.
  4. Gunakan akun database dengan hak akses minimum.
  5. Jangan menampilkan error database secara detail kepada pengguna.
  6. Simpan konfigurasi database di luar direktori publik dan jangan mengunggah kredensial ke repositori publik.
  7. Lakukan backup database secara berkala.
  8. Gunakan HTTPS untuk melindungi komunikasi antara browser dan server.
  9. Perbarui PHP, MySQL, framework, dan dependensi aplikasi.
  10. Lakukan pengujian keamanan secara berkala pada aplikasi yang dikembangkan.

Dengan menerapkan kebiasaan tersebut, risiko keamanan aplikasi dapat dikurangi secara signifikan.

Kesimpulan

SQL Injection merupakan salah satu ancaman keamanan yang dapat terjadi ketika aplikasi tidak memisahkan input pengguna dari struktur perintah SQL dengan benar.

Serangan ini berpotensi menyebabkan kebocoran informasi, manipulasi data, hingga akses tidak sah ke dalam aplikasi.

Salah satu cara paling penting untuk mencegah SQL Injection adalah menggunakan Prepared Statements, baik melalui MySQLi maupun PDO.

Selain itu, developer juga perlu menerapkan validasi input, password hashing, pembatasan hak akses database, serta pengelolaan error yang aman.

Bagi mahasiswa maupun developer yang sedang membangun aplikasi berbasis PHP dan MySQL, memahami SQL Injection merupakan bagian penting dalam mempelajari keamanan aplikasi.

Dengan menerapkan praktik pengembangan yang aman sejak awal, kita dapat membangun aplikasi yang tidak hanya berfungsi dengan baik, tetapi juga lebih terlindungi dari ancaman keamanan database.

Artikel terkait:

Selamat belajar dan selalu utamakan keamanan dalam pengembangan aplikasi!

Butuh Bantuan Skripsi atau Pembuatan Software?

Tim Anindyadev siap membantu bimbingan skripsi IT, pembuatan aplikasi kustom, dan implementasi metode algoritma.

Konsultasi Sekarang
Butuh Bantuan? Chat Kami