🛠️ SQL Injection
SQL Injection (SQLi) adalah teknik serangan di mana penyerang bisa memasukkan perintah SQL berbahaya melalui input user. Tujuannya untuk mencuri, merusak, atau memanipulasi data di database.
💥 Contoh Kode Berbahaya (Rentan SQLi)
<?php // Baris 1: Mengambil input dari URL parameter $id = $_GET['id']; // Baris 2: Query SQL tanpa filter apapun $query = "SELECT * FROM users WHERE id = '$id'"; // Baris 3: Jalankan query (rentan SQL Injection!) $result = mysqli_query($conn, $query); ?>
🔎 Penjelasan:
- Baris 1: Ambil input user (bisa diketik di URL).
- Baris 2: Query dibuat langsung pakai input user tanpa filter.
- Baris 3: Query dijalankan langsung ke database. Ini sangat berbahaya!
💡 Contoh Serangan SQL Injection
?id=1' OR '1'='1
🔎 Penjelasan: Query ini akan selalu benar karena '1'='1' selalu true, sehingga semua data ditampilkan.
🛡️ Cara Mencegah SQLi
Beberapa langkah penting (dengan contoh kode yang aman!):
1️⃣ Menggunakan Prepared Statement (PHP - MySQLi)
<?php // Baris 1: Siapkan statement SQL pakai placeholder ? $stmt = $conn->prepare("SELECT * FROM users WHERE id = ?"); // Baris 2: Bind input user (dianggap teks, bukan perintah SQL!) $stmt->bind_param("i", $id); // Baris 3: Jalankan query yang aman $stmt->execute(); ?>
🔎 Penjelasan:
- Baris 1: Querynya pakai tanda tanya (?) supaya input user tidak langsung masuk ke query.
- Baris 2: bind_param()
memastikan input user hanya diisi sebagai data.
- Baris 3: Query dijalankan dengan aman (tidak ada celah SQLi!).
2️⃣ Validasi & Batasi Input
// Contoh JavaScript: pastikan input hanya angka const idInput = document.querySelector('#id').value; if (!/^\d+$/.test(idInput)) { alert('Input tidak valid! Harus angka.'); }
🔎 Penjelasan: Memastikan input user hanya angka (untuk id), jadi tidak ada script atau perintah SQL yang lolos.
3️⃣ Hak Akses Minimum (Database)
🔎 Penjelasan: Buat user database dengan hak akses minimal. Jangan gunakan akun admin untuk semua query supaya kalau ada SQLi, dampaknya terbatas.