AJAX telah menjadi bagian inti dari hampir semua website modern—mulai dari form login, pencarian data, hingga transaksi finansial. Namun di balik kenyamanan interaksi asinkron tersebut, terdapat ancaman serius yang sering diremehkan: SQL Injection dari AJAX Request.
Banyak developer beranggapan bahwa karena AJAX berjalan di sisi client dan “tidak terlihat langsung”, maka lebih aman. Ini adalah kesalahan fatal. AJAX hanyalah cara pengiriman data—bukan mekanisme keamanan.
Dalam artikel ini, kita akan membahas secara mendalam dan praktis bagaimana SQL Injection terjadi melalui AJAX, serta cara mencegahnya secara sistematis, khususnya untuk website skala besar dan enterprise.
Contents
- 1 1. Apa Itu SQL Injection? (Dalam Konteks AJAX)
- 2 2. Contoh Nyata SQL Injection dari AJAX Request
- 3 3. Kesalahan Umum Developer dalam AJAX Security
- 4 4. Prinsip Utama Mencegah SQL Injection dari AJAX
- 5 5. Teknik Paling Efektif: Prepared Statement (WAJIB)
- 6 6. Gunakan ORM atau Query Builder
- 7 7. Validasi & Sanitasi Input (Lapisan Tambahan)
- 8 8. Jangan Pernah Bangun Query Dinamis dari AJAX Input
- 9 9. Batasi Hak Akses Database (Defense in Depth)
- 10 10. CSRF & SQL Injection (Kombinasi Berbahaya)
- 11 11. Logging & Monitoring SQL Injection Attempt
- 12 12. Web Application Firewall (Lapisan Tambahan)
- 13 13. SQL Injection di Website Skala Besar (Studi Kasus Umum)
- 14 14. Checklist Keamanan AJAX terhadap SQL Injection
- 15 15. Ide Baru: Security Contract untuk AJAX API
- 16 Kesimpulan
- 17 Related Posts
1. Apa Itu SQL Injection? (Dalam Konteks AJAX)
1.1 Definisi Singkat SQL Injection
SQL Injection adalah teknik serangan di mana attacker menyisipkan perintah SQL berbahaya melalui input pengguna untuk:
- Membaca data sensitif
- Mengubah atau menghapus data
- Mengambil alih autentikasi
- Mengontrol server database
1.2 Mengapa AJAX Rentan terhadap SQL Injection?
AJAX request:
- Mengirim data secara langsung ke server
- Sering berbentuk JSON atau POST body
- Tidak terlihat di URL → sering kurang diawasi
- Banyak endpoint kecil → sulit diaudit
Fakta penting:
AJAX tidak meningkatkan atau menurunkan keamanan.
Yang menentukan aman atau tidak adalah backend handling.
2. Contoh Nyata SQL Injection dari AJAX Request
2.1 Contoh AJAX Request Rentan
$.ajax({
url: "/search",
method: "POST",
data: {
keyword: $("#search").val()
}
});
Backend (PHP – contoh buruk):
$keyword = $_POST['keyword'];
$query = "SELECT * FROM products WHERE name LIKE '%$keyword%'";
Jika attacker mengirim:
%' OR 1=1 --
Maka query berubah menjadi:
SELECT * FROM products WHERE name LIKE '%%' OR 1=1 --'
Hasil: seluruh data terbuka.
3. Kesalahan Umum Developer dalam AJAX Security
❌ “AJAX Tidak Bisa Diakses Langsung”
Salah. AJAX endpoint bisa dipanggil langsung via:
- Browser DevTools
- Postman
- Curl
- Script otomatis
❌ “Sudah Validasi di JavaScript”
Validasi client-side bisa dilewati sepenuhnya.
❌ “Hanya Internal API”
Internal ≠ Aman. Banyak serangan berasal dari:
- Akun compromised
- XSS
- Insider threat
4. Prinsip Utama Mencegah SQL Injection dari AJAX
Golden Rule
Jangan pernah mempercayai data dari AJAX request.
Semua data dari:
- POST body
- JSON payload
- Header
- Query parameter
HARUS dianggap berbahaya.
5. Teknik Paling Efektif: Prepared Statement (WAJIB)
5.1 Mengapa Prepared Statement Sangat Penting?
Prepared Statement memisahkan:
- SQL query
- Data input
Sehingga input tidak pernah dieksekusi sebagai SQL.
5.2 Contoh Aman (PHP – PDO)
$stmt = $pdo->prepare(
"SELECT * FROM products WHERE name LIKE :keyword"
);
$stmt->execute([
'keyword' => "%$keyword%"
]);
5.3 Contoh Aman (Node.js – MySQL)
db.query(
"SELECT * FROM users WHERE email = ?",
[email],
callback
);
📌 Prepared Statement = Solusi #1 SQL Injection
6. Gunakan ORM atau Query Builder
ORM modern secara default aman dari SQL Injection jika digunakan dengan benar.
Contoh:
- Laravel Eloquent
- Sequelize
- Prisma
- Hibernate
User.findMany({
where: {
email: userInput
}
});
Catatan:
SQL Injection masih bisa terjadi jika:
- Menggunakan raw query
- Menggabungkan string manual
7. Validasi & Sanitasi Input (Lapisan Tambahan)
7.1 Validasi Tipe Data
Pastikan:
- ID → integer
- Email → format email
- Limit → angka dengan batas
if (!Number.isInteger(userId)) {
throw new Error("Invalid ID");
}
7.2 Whitelisting (Lebih Aman dari Blacklist)
❌ Jangan:
ORDER BY $sort
✅ Lakukan:
$allowedSort = ['name', 'price', 'created_at'];
if (!in_array($sort, $allowedSort)) {
$sort = 'name';
}
8. Jangan Pernah Bangun Query Dinamis dari AJAX Input
❌ Contoh Berbahaya:
$query = "SELECT * FROM $table WHERE $column = '$value'";
✅ Solusi:
- Mapping internal
- Switch-case
- Static query
9. Batasi Hak Akses Database (Defense in Depth)
9.1 Principle of Least Privilege
User database untuk AJAX:
- ❌ Jangan pakai root
- ❌ Jangan pakai ALL PRIVILEGES
Gunakan:
- SELECT only (jika read-only)
- Tidak boleh DROP / ALTER
9.2 Dampak Jika Terjadi Injection
Jika injection lolos:
- Damage tetap terbatas
- Tidak bisa menghapus database
10. CSRF & SQL Injection (Kombinasi Berbahaya)
AJAX endpoint yang:
- Tidak pakai CSRF token
- Terbuka untuk authenticated user
Bisa dieksploitasi untuk:
- Menyisipkan payload SQL via CSRF
Solusi:
- CSRF token
- SameSite cookie
- Header validation
11. Logging & Monitoring SQL Injection Attempt
11.1 Deteksi Pola Berbahaya
Log jika input mengandung:
' OR--UNION SELECT
11.2 Jangan Tampilkan Error SQL ke Client
❌:
{
"error": "SQL syntax error near 'UNION SELECT'"
}
✅:
{
"error": "Invalid request"
}
12. Web Application Firewall (Lapisan Tambahan)
Gunakan:
- WAF
- Cloudflare
- ModSecurity
WAF bukan pengganti prepared statement, tetapi:
- Menahan serangan massal
- Mengurangi noise
13. SQL Injection di Website Skala Besar (Studi Kasus Umum)
Pola Umum:
- Endpoint search
- Filter dinamis
- Export data
- Admin panel AJAX
Serangan sering terjadi karena:
- Endpoint lama
- Developer berbeda
- Kurang audit
14. Checklist Keamanan AJAX terhadap SQL Injection
✅ Prepared statement
✅ ORM / Query builder
✅ Validasi input server-side
✅ Whitelisting parameter
✅ Hak akses DB minimal
✅ Error message generik
✅ CSRF protection
✅ Monitoring & logging
✅ WAF (opsional)
15. Ide Baru: Security Contract untuk AJAX API
Konsep baru (enterprise-grade):
- Setiap AJAX endpoint memiliki:
- Contract input (schema)
- Type enforcement
- Allowed value list
Mirip API schema enforcement, tapi fokus ke security.
Kesimpulan
AJAX bukan penyebab SQL Injection—backend yang cerobohlah penyebabnya.
Pada website skala besar:
- Satu endpoint lemah = seluruh sistem terancam
- SQL Injection bisa berujung:
- Data breach
- Kerugian finansial
- Reputasi hancur
Pencegahan terbaik adalah disiplin teknis, bukan sekadar tool.
👉 Jika Anda hanya menerapkan prepared statement secara konsisten, 99% SQL Injection akan hilang.