prevent - nodejs mysql transaction
¿Cómo evita MongoDB el error de inyección de SQL? (5)
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 SQL.
En mi instinto, creo que entiendo esto. Si vars no optimizados se pasan a las consultas, no pueden salir de la estructura de consulta orientada a documentos con UNION
, JOIN
, consulta convertida comentario, etc.
¿Cómo evita MongoDB el error de inyección de SQL? ¿Es solo por naturaleza de esta sintaxis de consulta?
Con PHP, mongoDB puede volverse vulnerable a la inyección sin SQL:
http://www.idontplaydarts.com/2010/07/mongodb-is-vulnerable-to-sql-injection-in-php-at-least/
La base de datos puede no analizar el contenido, pero hay otras áreas del código que son vulnerables.
MongoDB evita el potencial de problemas al no analizar.
Cualquier API, en cualquier lugar, que implique codificar 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 se debe analizar 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.
Incidentalmente, el consejo de evitar las API que requieren análisis es el ítem 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.
Para protegerse contra la inyección de SQL, los clientes pueden usar las API de idioma 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 puede probar fácilmente su 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 puede copiar el filtro directamente al shell 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, se devuelve todo, a pesar de que solo quisiéramos que regresen los registros específicos.
Vea here una explicación más detallada sobre la inyección de SQL cuando usa 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 las consultas parametrizadas de Jongo .
Para resumir la documentation MongoDB
BSON
Cuando un programa cliente ensambla una consulta en MongoDB, crea un objeto BSON, no una cadena. Por lo tanto, los ataques de inyección SQL tradicionales no son un problema.
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 entra en esto en detalle: