Para protegerse contra la inyección de SQL, los clientes pueden utilizar las API del lenguaje de MongoDB. De esta forma, toda la entrada es de valor simple: los comandos no se pueden inyectar.Un ejemplo de Java:
collection.find(Filters.eq("key", "input value"))
El inconveniente es que no se puede probar fácilmente el filtro. No puedes copiarlo al caparazón de Mongo y probarlo. Especialmente problemático con filtros/consultas más grandes y más complejos.
PERO !!! también hay una API para no usar la API del filtro, lo que permite analizar cualquier filtro json. ejemplo de Java a continuación:
collection.find(BasicDBObject.parse("{key: "input value"}"));
Esto es bueno porque se puede copiar el filtro directamente a la consola MongoDB para probarlo.
PERO !!! (por último, lo prometo) esto es propenso a la inyección NoSql. Ejemplo de Java, donde el valor de entrada es {$gt: ""}
.
collection.find(BasicDBObject.parse("{key: {$gt: ""}}"));
En este último ejemplo, todo se devuelve, a pesar de que solo queremos que los registros específicos vuelvan.
Consulte here una explicación más detallada sobre la inyección SQL al usar los filtros directamente.
Una última cosa. Creo que hay una forma de usar ambos filtros sin formato y aún proteger contra la inyección de SQL. Por ejemplo, en Java, podemos usar Jongo's parameterized queries.
No creo que nadie haya comentado sobre los peligros potenciales del uso de analizar middlewares (como 'body-parser' con la nodejs' express' lib, por ejemplo). Si está analizando parámetros de publicación como JSON (que es bastante común) y luego pasa esos parámetros (o propiedades de esos parámetros) directamente a una consulta de mongo, un atacante puede insertar un objeto js donde esperaba una cadena/número (por ejemplo, podrían pasar '{$ gt: -1}' y ver todos los documentos de su colección) – JoeRocc