Logo Catatan Kader Logo Catatan Kader
  • Beranda
Beranda
Backend Engineering / Security

Modul 3: Keamanan & SQL Injection

Cyber Security Concept

Modul 03

"Garis Pertahanan Utama Database Anda"

Diperbarui Terakhir
50 Menit Eksekusi

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.

Anatomi Serangan

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!";
}
Kader Note (Konteks Framework):

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.

Kembali ke Beranda

Catatan Kader

"Jangan pernah percaya pada input dari user (Never trust user input). Lakukan validasi, dan selalulah gunakan Prepared Statements."
- Abdul Kader
Catatan Kader Catatan Kader

Catatan ini dikelola untuk keperluan dokumentasi pribadi, pengembangan kemampuan analisis logika, serta standarisasi implementasi sistem teknologi.

© 2026 Catatan Kader. Deployment Active.