Modul 3: Keamanan & SQL Injection
Modul 03
"Garis Pertahanan Utama Database Anda"
SQL Injection (SQLi) adalah teknik eksploitasi di mana peretas menyisipkan perintah SQL berbahaya melalui input form atau URL. Tanpa penanganan yang tepat, mereka bisa mencuri, mengubah, hingga menghapus seluruh database Anda.
Bagaimana Database Dijebol?
01 Query yang Rentan (Vulnerable)
Kesalahan paling umum adalah menggabungkan string query secara langsung dengan input dari user (String Concatenation).
<?php
// Input dari user (misal dari form login)
$username = $_POST['username']; // User memasukkan: admin' OR '1'='1
$password = $_POST['password']; // User memasukkan: sembarang
// ❌ SANGAT BERBAHAYA!
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$pdo->query($sql);
Query akhir yang dieksekusi database akan
menjadi: SELECT * FROM users WHERE username = 'admin' OR '1'='1' ....
Karena '1'='1' selalu BENAR (True), hacker otomatis berhasil login tanpa tahu password!
02 Solusi: Prepared Statements
Prepared Statements memisahkan antara struktur instruksi SQL dengan data input. PDO akan memastikan data input diperlakukan murni sebagai string biasa, bukan sebagai perintah SQL tambahan.
<?php
$username = $_POST['username'];
$password = $_POST['password'];
// ✅ AMAN: Gunakan placeholder (?) atau bernama (:username)
$sql = "SELECT * FROM users WHERE username = :username AND password = :password";
// 1. Prepare (Siapkan strukturnya)
$stmt = $pdo->prepare($sql);
// 2. Execute (Kirimkan datanya)
$stmt->execute([
'username' => $username,
'password' => $password
]);
$user = $stmt->fetch();
03 Menyimpan Data Baru (Insert) dengan Aman
Metode yang sama wajib digunakan saat melakukan operasi
INSERT, UPDATE, atau DELETE.
<?php
$nama = $_POST['nama'];
$email = $_POST['email'];
$sql = "INSERT INTO kader (nama, email) VALUES (:nama, :email)";
$stmt = $pdo->prepare($sql);
// Data akan disanitasi secara otomatis oleh PDO
if ($stmt->execute(['nama' => $nama, 'email' => $email])) {
echo "Data berhasil disimpan dengan aman!";
}
Ketika Anda menggunakan
Eloquent ORM di Laravel (contoh: User::where('email', $email)->first()),
Laravel sudah menggunakan PDO Prepared Statements secara *default*.
Namun, pemahaman ini menjadi sangat penting saat Anda terpaksa menulis query manual
menggunakan DB::raw() di Laravel, agar Anda tidak menciptakan celah
keamanan secara tidak sengaja.