Mencegah SQL Injection
Ada beberapa teknik untuk mencegah SQL Injection. Teknik utama dan paling efektif adalah parameterized queries (prepared statements).
1. Parameterized Queries (Prepared Statements)
Memisahkan struktur query dari data input. Database engine tahu mana yang query dan mana yang data.
// PHP dengan PDO
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->execute([
":username" => $username,
":password" => $password
]);
// Node.js dengan mysql2
const [rows] = await connection.execute(
"SELECT * FROM users WHERE username = ? AND password = ?",
[username, password]
);
2. ORM (Object-Relational Mapping)
Framework ORM seperti Eloquent (Laravel), Prisma, atau Sequelize secara otomatis menggunakan prepared statements:
// Laravel Eloquent — aman secara default
$user = User::where("username", $username)
->where("password", $hashedPassword)
->first();
// Prisma (Node.js) — aman secara default
const user = await prisma.user.findFirst({
where: { username, password: hashedPassword }
});
3. Input Validation
Validasi tipe dan format input sebelum diproses:
// Validasi bahwa ID harus berupa angka
$id = filter_input(INPUT_GET, "id", FILTER_VALIDATE_INT);
if ($id === false) {
http_response_code(400);
die("Invalid ID");
}
Hal yang TIDAK Cukup
- Escaping saja — Tidak selalu efektif, mudah terlewat
- Blacklist karakter — Penyerang selalu menemukan cara bypass
- WAF saja — Web Application Firewall bukan pengganti kode yang aman
Best Practices
- Selalu gunakan parameterized queries tanpa pengecualian
- Gunakan ORM yang sudah terbukti aman
- Terapkan principle of least privilege pada database user
- Jangan tampilkan error SQL ke pengguna
- Gunakan stored procedures untuk query kompleks
- Lakukan security testing secara berkala