Cara Mencegah SQL Injection dari AJAX Request: Panduan Keamanan Website Skala Besar

Cara Mencegah SQL Injection dari AJAX Request: Panduan Keamanan Website Skala Besar

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.


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.