- Pendahuluan
Dalam pengembangan aplikasi web modern, integritas data adalah prioritas utama. Salah satu ancaman
keamanan yang paling gigih dan berbahaya adalah SQL Injection (SQLi). Serangan ini menempati peringkat atas dalam daftar OWASP Top 10 selama bertahun-tahun. Artikel ini bertujuan untuk mendemonstrasikan bagaimana celah SQLi terjadi melalui eksperimen langsung dan menjelaskan langkah-langkah teknis untuk memitigasi risiko tersebut, guna membangun aplikasi web yang lebih tangguh.
2. Memahami SQL Injection
SQL Injection adalah teknik di mana penyerang memasukkan perintah SQL berbahaya ke dalam input field aplikasi web. Tujuannya adalah untuk memanipulasi query yang dikirim ke database. Jika aplikasi tidak melakukan sanitasi input dengan benar, penyerang dapat membaca data sensitif (seperti password), memodifikasi database, atau bahkan mendapatkan akses administratif.
3. Eksperimen: Simulasi Kerentanan
Untuk memahami konsep ini, saya melakukan eksperimen menggunakan lingkungan server lokal (XAMPP) dengan skrip PHP sederhana sebagai berikut:
A. Kode yang Rentan (Vulnerable Code)
// Skrip login sederhana yang rentan
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM users WHERE username = '$username' AND password =
'$password'";
$result = $conn->query($sql);
B. Langkah-Langkah Eksperimen
- Input Normal: Memasukkan username dan password yang benar. Hasil: Pengguna berhasil login.
- Payload Serangan: Pada field username, saya memasukkan payload: admin' –
- Analisis Query: Query yang dieksekusi oleh database menjadi:
SELECT * FROM users WHERE username = 'admin' – ' AND password =
'…'
Hasil Eksperimen: Karakter kutip tunggal (') memutus string, dan karakter – (double dash)
menganggap sisa query sebagai komentar. Hasilnya, saya berhasil login sebagai 'admin' tanpa mengetahui password sama sekali.
4. Mitigasi: Menggunakan Prepared Statements
Cara paling efektif untuk mencegah SQLi adalah dengan menggunakan Prepared Statements atau
Parameterized Queries. Teknik ini memisahkan struktur query SQL dari data input pengguna.
Perbaikan Kode:
// Menggunakan PDO untuk keamanan
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :user');
$stmt->execute(['user' => $username]);
$user = $stmt->fetch();
5. Analisis dan Perbandingan
Metode Tingkat
Keamanan Keterangan
String Concatenation Sangat Rendah Input langsung digabung ke query. Sangat mudah
diserang.
(addslashes) Sanitasi Manual
Sedang Masih memiliki celah pada encoding karakter
tertentu.
Prepared Statements Tinggi Standar industri saat ini. Menghilangkan risiko SQLi secara total.
6. Kesimpulan
Eksperimen ini menunjukkan bahwa celah keamanan sekecil apapun pada input form dapat berakibat
fatal. Sebagai pengembang, kita tidak boleh mempercayai input yang datang dari pengguna. Penggunaan
Prepared Statements adalah kewajiban dalam pemrograman web modern untuk memastikan aplikasi
terhindar dari manipulasi basis data yang merugikan.
Referensi
- OWASP Foundation. "SQL Injection Prevention Cheat Sheet".
- 2. PHP Documentation. "PDO Class – Prepared Statements".
- 3. W3Schools. "Web Security – SQL Injection."