2011-02-16 31 views
50

Estaba leyendo mi fiel libro de O'Reilly y encontré un pasaje sobre cómo Mongo, por naturaleza, evita el cúmulo de fallas similares a las de la inyección de SQL.¿Cómo evita MongoDB el error de inyección de SQL?

En mi instinto, creo que entiendo esto. Si VARs unsanitized se pasan a las consultas, que no pueden salir de la estructura de consulta orientada a documentos con un UNION, JOIN, consulta convertido comentario, etc.

¿Cómo evita el desorden MongoDB inyección de SQL? ¿Es solo por naturaleza de esta sintaxis de consulta?

+0

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

Respuesta

39

MongoDB evita el potencial de problemas al no analizar.

Cualquier API, en cualquier lugar, que implique la codificación de datos de usuario en texto formateado que se analiza tiene la posibilidad de que el llamante y el destinatario no estén de acuerdo en cómo debe analizarse ese texto. Estos desacuerdos pueden ser problemas de seguridad cuando los datos se malinterpretan como metadatos. Esto es cierto ya sea que esté hablando de cadenas de formato de impresión, incluido el contenido generado por el usuario en HTML, o generando SQL.

Dado que MongoDB no analiza el texto estructurado para determinar qué hacer, no hay posibilidad de interpretar erróneamente la entrada del usuario como instrucciones, y por lo tanto, no hay un posible agujero de seguridad.

Por cierto, el consejo de evitar las API que requieren análisis es el elemento 5 en http://cr.yp.to/qmail/guarantee.html. Si está interesado en escribir un software seguro, las otras 6 sugerencias también valen la pena mirar.

+13

tenga en cuenta que esta respuesta (aunque útil) es incorrecta; las otras dos respuestas brindan un caso en el que se puede realizar el ataque "similar a una inyección de SQL". Es un mundo salvaje y necesita desinfectar adecuadamente sus datos de entrada. ;) – johndodo

+5

@johndodo Tenga en cuenta que mi respuesta apareció * antes * se descubrió la vulnerabilidad de PHP. También tenga en cuenta que mi respuesta sigue siendo correcta para todos los idiomas que no sean PHP, y que la causa del agujero es el voluntariado de PHP para analizar los datos de una manera sorprendente. – btilly

+2

cierto - No quise oponerme, pero muchas personas encuentran respuestas a través de Google, así que pensé en dejar las cosas claras. Además, aunque no estoy familiarizado con otros lenguajes web, algunas entradas HTML publican valores como matrices, por lo que diría que el problema no es solo PHP. La regla general aún se aplica: siempre valide la entrada del usuario. – johndodo

23

para resumir la MongoDB documentation

BSON

Como un programa cliente monta una consulta en MongoDB, se construye un objeto BSON, no es una cadena. Por lo tanto, los ataques de inyección SQL tradicionales son sin problemas.

Sin embargo, MongoDB no es inmune a los ataques de inyección. Como se señala en la misma documentación, los ataques de inyección todavía son posibles ya que las operaciones de MongoDB permiten que se ejecuten expresiones de JavaScript arbitrarias directamente en el servidor. La documentación se dedica a esto en detalle:

http://docs.mongodb.org/manual/faq/developers/#javascript

+4

No es toda la historia. Justo debajo de su presupuesto, la misma documentación explica cómo ejecutar JavaScript arbitrario contra Mongo. Este comportamiento está habilitado de forma predeterminada y la documentación dice: ["Debe tener cuidado en estos casos para evitar que los usuarios envíen JavaScript malicioso"] (http://docs.mongodb.org/manual/faq/developers/#javascript) Puede deshabilitar la compatibilidad con JS, pero eso [también deshabilita el soporte de JS para el scripting del lado del servidor] (http://docs.mongodb.org/manual/administration/security-checklist/). OWASP habla de esto [aquí] (https://www.owasp.org/index.php/Testing_for_NoSQL_injection) –

+0

No hace falta decir que los ataques de inyección SQL no son un problema, MongoDB no entiende SQL. Sin embargo, los ataques de inyección No-SQL aún son posibles con MongoDB. –

+0

La pregunta se refiere específicamente a los ataques de inyección de SQL, pero estoy de acuerdo en que los riesgos relacionados con el no-sql deben aclararse. He actualizado la respuesta. –

15
+1

Acabo de ver eso. Tenga en cuenta que el problema radica fundamentalmente en que PHP analiza sintácticamente las entradas de los usuarios, lo que permite que los datos y los metadatos se confundan de una forma que no debería haber sido posible. – btilly

+0

@James Entonces, colocar un molde de cuerda antes de las variables solucionará este problema ... ¿Hay algo más por lo que deba preocuparme, o es la única solución? – Abdul

3

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.