Todo lo que he visto en los ataques de inyección SQL parece sugerir que las consultas parametrizadas, particularmente las de procedimientos almacenados, son la única forma de protegerse contra tales ataques. Mientras trabajaba (en la Edad Media), los procedimientos almacenados eran vistos como una mala práctica, principalmente porque eran vistos como menos mantenibles; menos comprobable muy acoplado y bloqueó un sistema en un proveedor; ( Esta pregunta cubre algunas otras razones).
Aunque cuando estaba trabajando, los proyectos prácticamente ignoraban la posibilidad de tales ataques; Se adoptaron varias reglas para proteger la base de datos contra la corrupción de diversos tipos. Estas reglas pueden resumirse como:
- Ningún cliente / aplicación tenía acceso directo a las tablas de la base de datos.
- Todos los accesos a todas las tablas se realizaron a través de vistas (y todas las actualizaciones de las tablas base se realizaron mediante disparadores).
- Todos los elementos de datos tenían un dominio especificado.
- No se permitía que ningún elemento de datos fuera anulable; esto tenía implicaciones que tenían a los DBA rechinando los dientes en ocasiones; pero se hizo cumplir.
- Los roles y los permisos se configuraron de manera adecuada; por ejemplo, un rol restringido para otorgar solo a las vistas el derecho de cambiar los datos.
Entonces, ¿es un conjunto de reglas (forzadas) como esta (aunque no necesariamente este conjunto particular) una alternativa apropiada a las consultas parametrizadas para prevenir ataques de inyección SQL? ¿Si no, porque no? ¿Se puede proteger una base de datos contra tales ataques mediante medidas específicas (solo) de la base de datos?
EDITAR
El énfasis de la pregunta cambió ligeramente, a la luz de las respuestas iniciales recibidas. Pregunta base sin cambios.
EDIT2
El enfoque de confiar en consultas paramaterizadas parece ser solo un paso periférico en la defensa contra los ataques a los sistemas. Me parece que las defensas más fundamentales son deseables, y pueden hacer que depender de tales consultas no sea necesario, o menos crítico, incluso para defenderse específicamente contra los ataques de inyección.
El enfoque implícito en mi pregunta se basó en "armar" la base de datos y no tenía idea de si era una opción viable. La investigación adicional ha sugerido que existen tales enfoques. He encontrado las siguientes fuentes que proporcionan algunos consejos para este tipo de enfoque:
http://database-programmer.blogspot.com
http://thehelsinkideclaration.blogspot.com
Las características principales que he tomado de estas fuentes son:
- Un amplio diccionario de datos, combinado con un amplio diccionario de datos de seguridad
- Generación de disparadores, consultas y restricciones a partir del diccionario de datos.
- Minimice el código y maximice los datos
Si bien las respuestas que he tenido hasta ahora son muy útiles y señalan las dificultades que surgen al ignorar las consultas paramaterizadas, en última instancia, no responden mis preguntas originales (ahora enfatizadas en negrita).