Back to blog
Security

Apa itu NoSQL Injection? Bahaya Tersembunyi di MongoDB

Banyak yang mengira karena MongoDB tidak menggunakan tabel SQL tradisional, maka ia aman dari serangan injeksi hacker. Mitos ini terbukti memakan banyak korban.

super admin·20 Juni 2026·2 min read
Apa itu NoSQL Injection? Bahaya Tersembunyi di MongoDB
Article Content

Mitos Keamanan yang Mematikan

Ketika mempelajari keamanan Backend, kita selalu diwanti-wanti soal SQL Injection (Hacker memasukkan teks ' OR 1=1 ke dalam *query* MySQL). Banyak pengguna *Stack MERN (MongoDB, Express, React, Node)* bersorak: "Syukurlah kita pakai MongoDB, tidak ada syntax SQL, jadi kita 100% aman!"

Ini adalah kesalahan fatal. MongoDB memang kebal terhadap *SQL Injection*, tapi mereka rentan terhadap saudara kembarnya: NoSQL Injection.

Bagaimana Hacker Menjebol Login MongoDB?

Misalkan kamu memiliki fungsi API *Login* di Express.js seperti ini:

// Fungsi Login Rentan
app.post('/login', async (req, res) => {
  const { username, password } = req.body;
  
  // Mencari user yang username & passwordnya cocok
  const user = await db.users.findOne({ 
    username: username, 
    password: password 
  });
  
  if (user) return res.send("Login Sukses!");
});

Normalnya, *user* akan mengirim JSON: { "username": "budi", "password": "rahasia123" }.

Tapi, bagaimana jika Hacker pintar tidak mengirimkan teks (String), melainkan mengirimkan Objek Operator MongoDB $gt (Greater Than / Lebih Besar Dari) ke dalam input Password?

// Payload Jahat dari Hacker
{
  "username": "admin",
  "password": { "$gt": "" }
}

Bencana Terjadi di Backend

Kode Express-mu akan dengan polosnya meneruskan objek jahat itu ke MongoDB. Query *database* aslinya akan berubah menjadi:
"Carikan akun yang username-nya 'admin', dan password-nya LEBIH BESAR DARI KOSONG."

Karena semua *password* di dunia ini panjangnya pasti lebih besar dari nol, kondisi tersebut langsung dievaluasi menjadi TRUE (Benar). MongoDB akan menyerahkan akun Admin kepada *Hacker* tersebut tanpa perlu *password* sama sekali!

Cara Mencegah NoSQL Injection

Sama seperti SQL, kuncinya adalah Sanitasi Input (Membersihkan Ketikan User).

  1. Paksa Tipe Data: Jika *password* itu harus berupa teks (String), pastikan *Backend*-mu mengkonversinya secara paksa (Tipe *Casting*) menjadi String sebelum disentuh oleh database. password: String(req.body.password). Jika hacker mengirim Objek, itu akan berubah menjadi teks tidak berguna "[object Object]".
  2. Gunakan Library Mongoose (ODM): Sama seperti SQL yang butuh ORM, gunakan *Mongoose* di Node.js. Mongoose Schemas akan menolak keras setiap bentuk data yang tidak sesuai dengan rancangan tabel (Schema) yang kamu buat sejak awal, sehingga operator injeksi otomatis ditolak!
  3. Sanitizer Library: Gunakan *library* seperti express-mongo-sanitize di Middleware Express-mu. Alat ini otomatis mencari tanda *Dollar* ($) dan titik (.) di dalam req.body yang dikirim *user*, lalu menghapusnya agar tidak tereksekusi sebagai operator MongoDB.

Mau langsung pakai template?

Jelajahi template gratis dan premium di TampilKit untuk mempercepat proses development project kamu.

Browse Templates