Explica cómo entradas no confiables pueden convertirse en operadores MongoDB y cómo prevenir inyección mediante validación, allowlists y consultas construidas en servidor.
MongoDB queries son objetos estructurados, no strings SQL. Eso evita una clase de SQL injection, pero introduce operator injection: un atacante puede enviar claves como $ne, $gt, $regex o estructuras inesperadas si la aplicación copia input directamente al filtro o update.
TypeScript
// peligrosoconst user =await users.findOne(req.body);
Payload:
JSON
{"email":{"$ne":null},"password":{"$ne":null}}
El problema no es MongoDB: la aplicación entregó control sobre la estructura de la consulta.
Objetos no confiables pueden incluir claves que empiezan por $ o contienen .. Aunque drivers y ODMs aplican restricciones y sanitización en algunos contextos, no debes depender de defaults que cambian entre versiones.
Rechaza claves desconocidas y utiliza schemas strict.
Construye stages en servidor y permite solo parámetros escalares. Protege especialmente $lookup, $out, $merge, $function, expresiones JavaScript y namespaces.
Toda query debe incluir scope derivado de la sesión, nunca del body:
TypeScript
const order =await orders.findOne({
_id:newObjectId(input.id),
businessId: auth.businessId
});
No uses businessId enviado por el cliente como autorización. En $lookup, updates, deletes y aggregations, aplica el tenant en todas las ramas relevantes.
Evita ejecutar código proporcionado por usuarios en expresiones o funciones server-side. No construyas $where ni $function con input. Además del riesgo de seguridad, suele ser difícil de indexar y operar.
NoSQL no significa injection-free. El riesgo aparece cuando el cliente controla la estructura de filtros, updates, pipelines, sort o projection. La defensa es validar runtime, usar allowlists, construir consultas campo por campo y derivar autorización del servidor, no del payload.