
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).
- 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]". - 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!
- Sanitizer Library: Gunakan *library* seperti
express-mongo-sanitizedi Middleware Express-mu. Alat ini otomatis mencari tanda *Dollar* ($) dan titik (.) di dalamreq.bodyyang 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