¿El uso de bases de datos no SQL elimina la necesidad de proteger contra la "inyección SQL"?

Esto puede parecer una pregunta obvia (o no tan obvia), pero déjame explicarte. Estoy codificando un sitio de Google App Engine utilizando la tecnología de database de Google, BigTable. Cualquier progtwigdor de App Engine sabrá que Google tiene su propio lenguaje de consulta limitado llamado GQL. Como resultado, estoy tentado de no hacer ninguna comprobación de inyección de SQL (o GQL) en mi aplicación, ya que supongo que Google no está utilizando una consulta de cadena sin formatting en sus methods de back-end para get datos.

Además, las bibliotecas para tecnologías DB como CouchDB, MongoDB y otras bases de datos de objects o documentos (también conocidas como NoSQL) parecen obviar la necesidad de verificar si un usuario malintencionado está inyectando commands de manipulación de bases de datos. A menudo tienen bibliotecas que mapean directamente los objects en la database para objetar en el idioma de su elección. Sé que hay muchas bibliotecas SQL que hacen esto también, pero supongo que en algún nivel están combinando parameters para ejecutar una consulta sobre una cadena, y por lo tanto todavía debo usar protección de inyección SQL incluso con esos frameworks.

¿Estoy siendo miope? ¿O solo es cuestión de time hasta que el siguiente gran sistema de BD se arraigue y entonces veré la inyección en esos sistemas?

Los agujeros de "inyección" tienen que ver con los desajustes del context de text. Cada vez que colocas una cadena de text en otro context de cadena, necesitas hacer una encoding que se ajuste al context modificado. Parece seductoramente simple ensamblar cadenas a ciegas, pero la dificultad del procesamiento de cadenas es engañosa.

Las bases de datos con una interfaz puramente basada en objects son inmunes a las vulnerabilidades de inyección, al igual que las consultas con parameters en SQL. No hay nada que un atacante pueda poner en su cadena para salir del context literal de cadena en el que lo ha puesto.

Pero GQL específicamente no es uno de estos. Es un lenguaje de consulta de cadena, y si va concatenando material no escamoteado no confiable a una consulta como "WHERE title='%s'" % title , es tan vulnerable como lo era con SQL completo. Tal vez las capacidades limitadas de GQL hacen que sea más difícil explotar eso para comprometer completamente la aplicación, pero ciertamente no es imposible en general, y en el mejor de los casos su aplicación sigue siendo incorrecta y se caerá cuando las personas intenten usar apóstrofos legítimamente.

GQL tiene una interfaz de enlace de parameters. Úselo. Resista el encanto de la piratería de strings.

Los subsets SQL, como GQL, obviamente aún se preocupan por él, pero las bases de datos puras, que no son SQL, como CouchDB, Voldemort, etc. deben poner y get datos sin preocuparse por los ataques al estilo de inyección de SQL.

Sin embargo, eso no lo excusa de realizar validation de contenido, porque si bien puede no romper la database, puede romper su aplicación y permitir cosas como XSS (si es una aplicación web).

Cada vez que se utilizan o se manipulan datos a partir de la input del usuario para controlar la ejecución del código, es necesario que haya una desinfección. He visto casos en los que el código utilizaba la input del usuario para ejecutar un command sin desinfectar la input. No había sido explotado, pero si lo hubiera sido, habría sido un horrible vector de ataque.

La inyección de SQl es solo un subset de un tipo de falla de security en la que se evalúa cualquier input no controlada.

tecnológicamente, usted podría "inyectar" javascript, entre otros.