1. Anatomi SQL Injection
**SQL Injection (SQLi)** adalah salah satu kerentanan tertua namun paling merusak dalam sejarah web. Celah ini terjadi ketika input dari pengguna yang tidak divalidasi digabungkan langsung (*string concatenation*) ke dalam string query SQL yang dieksekusi database.
example.js
javascript
| 1 | // ❌ SANGAT BERBAHAYA: String Concatenation Langsung |
| 2 | const query = "SELECT * FROM users WHERE email = '" + userEmail + "' AND password = '" + pass + "'"; |
| 3 | |
| 4 | // Jika penyerang memasukkan input: admin@kulo.dev' OR '1'='1 |
| 5 | // Query yang terbentuk menjadi: |
| 6 | // SELECT * FROM users WHERE email = 'admin@kulo.dev' OR '1'='1' AND password = '...' |
| 7 | // Hasilnya: Penyerang bisa login sebagai admin tanpa mengetahui password! |
2. Mengapa Parameterized Queries Menghilangkan Celah 100%?
Dengan **Parameterized Queries (Prepared Statements)**, query dikirim ke database dalam dua tahap terpisah:
example.js
javascript
| 1 | // ✅ AMAN: Menggunakan Tagged Template Literals / Parameterized Query |
| 2 | import sql from '@/lib/db'; |
| 3 | |
| 4 | const user = await sql` |
| 5 | SELECT id, email, role |
| 6 | FROM users |
| 7 | WHERE email = ${userEmail} |
| 8 | `; |