Enviando el nombre de la base de datos en los encabezados de solicitud

0

Estoy haciendo un proyecto con una arquitectura de servidor único y base de datos múltiple. Cada solicitud de cliente contendrá un encabezado que contenga el nombre de la base de datos que esta solicitud debe conectar. ¿Es esta una buena idea para revelar el nombre de la base de datos? ¿Es este un problema de seguridad?

    
pregunta Anooj Krishnan G 27.04.2015 - 12:40
fuente

3 respuestas

8

Esto no es una buena idea. Un atacante podría cambiar el nombre de la base de datos, proporcionar uno inválido o poner caracteres especiales en el nombre de la base de datos y posiblemente explotar una inyección de SQL. Es posible hacer mucho daño dependiendo de su configuración.

Puede usar sesiones del lado del servidor y enviar solo el token de sesión al usuario. La base de datos a la que se está conectando debe almacenarse en la sesión del lado del servidor.

    
respondido por el ThoriumBR 27.04.2015 - 15:20
fuente
7

Es un problema de seguridad, y manipular los encabezados, o realmente, cualquier cosa que tenga del lado del cliente es muy fácil. Nunca debes confiar en nada que venga del cliente.

Definitivamente sugeriría que tenga una lista blanca de valores aceptables que se aplica en el lado del servidor para evitar las inyecciones de SQL. Esta lista podría generarse dinámicamente, pero asegúrese de que nunca, nunca, use algo que provenga del cliente en una cadena de conexión de base de datos o en una consulta construida de forma dinámica.

Como han sugerido otros, el nombre de la base de datos debe almacenarse en el lado del servidor, en un token de sesión, y no enviarse a través de encabezados HTTP.

OWASP tiene un montón de buena información sobre el tema de las inyecciones de SQL. Consulte enlace

    
respondido por el Jean-François Rioux 27.04.2015 - 15:24
fuente
2

Si todo lo que está pasando es un nombre simple que identifica una base de datos para usar, entonces no puedo ver ningún problema inmediato (siempre que haga una validación del lado del servidor).

Intentaría evitar el uso de nombres que proporcionen más información sobre la base de datos que la necesaria (por ejemplo, direcciones del servidor, información del sistema o de la versión, etc.). De hecho, podría ser mejor usar solo una identificación numérica o algo similar para identificar los servidores en su lugar. Asigne esto a las bases de datos reales de su servidor, donde las posibilidades de que alguien vea esta información son menores. Cuanta menos información necesite saber un cliente, mejor!

Además, debe verificar el derecho de un usuario a acceder a la base de datos especificada. Si se manipula una solicitud de un cliente para intentar acceder a una base de datos distinta a la que debería, entonces la lógica del lado del servidor debe cancelar la solicitud, o al menos verificar que el usuario tenga permiso para acceder a esta otra base de datos .

    
respondido por el Kjartan 27.04.2015 - 15:18
fuente

Lea otras preguntas en las etiquetas