Modul 3

Keamanan & SQL Injection

Kategori: phpRilis: Maret 15, 2026Waktu Baca: 15 Menit
Keamanan & SQL Injection
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.

MODUL SEBELUMNYAKoneksi Database PDO
SELANJUTNYA TERKUNCIModern Frontend Execution: Vite & TypeScript