Pregunta

Parece que uno podría detener toda la amenaza de inyección SQL de una vez por todas simplemente rechazando todas las consultas que no usan parámetros con nombre. ¿Alguna forma de configurar SQL Server para hacer eso? ¿O alguna forma de hacer cumplir eso a nivel de aplicación inspeccionando cada consulta sin escribir un analizador SQL completo? Gracias.

¿Fue útil?

Solución

Solo hay un par de formas de hacer esto. OMG Ponies tiene la mejor respuesta: no permita las declaraciones directas de SQL en su base de datos y, en su lugar, aproveche las herramientas y el servidor SQL de seguridad que pueda proporcionar.

Una forma alternativa sería agregar un nivel adicional que todas las consultas tendrían que pasar. En resumen, pasaría todas las consultas (arquitectura SOA) a una nueva aplicación que evaluaría la consulta para pasar a SQL Server. He visto exactamente a una compañía hacer esto en reacción a los problemas de inyección de SQL que tenía su sitio.

Por supuesto, esta es una forma horrible de hacer las cosas porque la inyección de SQL es solo un problema potencial.

Más allá de la inyección SQL, también tiene problemas de lo que sucede cuando el sitio en sí está roto. Una vez que pueda escribir una nueva página en un servidor web, se vuelve trivial pasar cualquier consulta que desee al servidor de base de datos asociado. Esto fácilmente omitiría cualquier cosa de nivel de código que pueda establecer. Y permitiría al atacante escribir select * from ... o truncate table ... Diablos, una persona interna podría conectarse directamente al servidor SQL utilizando las credenciales de los sitios y ejecutar cualquier consulta que quisieran.

El punto es que si aprovecha la seguridad incorporada en SQL Server para evitar el acceso directo a la tabla, puede controlar a través de los procedimientos almacenados. El rango completo de acciones está disponible para cualquier persona que intente conectarse al servidor.

Otros consejos

  1. Elimine las subvenciones para que un rol pueda seleccionar/actualizar/insertar/eliminar contra la (s) tabla (s) involucrada
  2. Subvención Ejecutar sobre el papel de procedimientos/funciones almacenados/etc.
  3. Asociar el rol a los usuarios de la base de datos que desea asegurar

No detendrá una cuenta que también tenga la capacidad de otorgar acceso, pero evitará que los usuarios asociados al rol (suponiendo que ninguna otra subvención por usuario) pueda ejecutar consultas fuera del procedimiento/funciones almacenadas /etc que existen.

¿Y cómo quieres verificar eso? Las consultas a veces tienen valores constantes que se agregarían tan fácilmente a la consulta. Por ejemplo, tengo una base de datos que está preparada para ser multimingual, pero no todo el código lo es, por lo que mi consulta se ve así:

SELECT NAME FROM SOMETABLE WHERE ID = :ID AND LANGUAGEID = 1

La ID es un parámetro, pero la ID del idioma no lo es. ¿Debería bloquearse esta consulta?

Pide bloquear consultas que no usen parámetros con nombre. Que se puede aplicar fácilmente. Simplemente bloquee cualquier consulta que no especifique ningún parámetro. Puede hacer esto en su capa de aplicación. Pero será difícil bloquear consultas como la anterior, donde un valor es un parámetro y el otro no lo es. Deberá analizar esa consulta para detectarlo, y también será difícil.

No creo que SQL Server tenga ninguna característica incorporada para hacer esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top