2010-01-16 17 views
7

Si una aplicación C# se conecta a un servidor mysql desde un cliente, ¿cómo almaceno el nombre de usuario/contraseña mysql para la conexión? Si lo tengo en un archivo de configuración o incrustado en el origen, puede encontrarlo mediante ingeniería inversa. No es posible darles a todos los usuarios una contraseña MySql.C# prácticas de conexión mysql

Además, tengo un inicio de sesión para la aplicación. ¿Cómo hago para exigir que el usuario pase por el proceso de inicio de sesión y no solo realice ingeniería inversa y comente el código C# para verificar el inicio de sesión?

¿Hay alguna forma de administrar estas conexiones entre MySql y una aplicación del lado del cliente o debe haber un tercer programa en el lado del servidor interactuando con la base de datos localmente para estar seguro?

+0

Interesante ... Iba a marcar esto como un dup, pero una búsqueda en SO resultó nula. La pregunta solo se ha hecho sobre ASP.NET, aparentemente nunca sobre los clientes de Winform. –

Respuesta

3

Quizás pueda tener un sistema de dos etapas: Tener una cuenta de SQL cuyo único permiso sea ejecutar un procedimiento almacenado tomando el nombre de usuario y la contraseña del usuario y dándoles las credenciales para usar con la cuenta real. Cuando el usuario inicia sesión, se conecta usando la cuenta restringida, obtiene las credenciales para la cuenta real y luego hace su trabajo usando esa cuenta. También puede cambiar la contraseña de SQL con bastante frecuencia. Si sospecha que un usuario tiene juego sucio, haga que el procedimiento les devuelva un conjunto diferente de credenciales y rastree esas credenciales.

+0

Creo que me gusta esto. ¿Hay algún problema potencial con esta solución? – MattR

+1

Según lo mencionado por Paul Sasik, si se usa una contraseña compartida, un usuario con suficiente acceso a su propia máquina puede tomar esa contraseña. Entonces, si bien esto mitigará el problema (solo los usuarios que inician sesión pueden descubrir la contraseña de SQL), no la elimina. Para eliminarlo por completo, necesitaría tener algo entre el usuario y la base de datos. – Yuliy

1

Aquí está el problema. Confías en el usuario final con los binarios que invocarán consultas MySQL. Esto significa, sin lugar a dudas, que un usuario inteligente podría "tomar el control" y ejecutar consultas directamente.

Hay cosas que puede hacer para mejorar la situación. Parece que estás en una LAN. ¿Por qué no puedes darle a cada usuario su propio usuario de base de datos? Eso significa que la autenticación es (a) cuidada por usted, y (b) puede usar permisos "reales" de MySQL para limitar el daño que pueden hacer. Además, puede usar procedimientos almacenados y darles solo acceso a los procesos, lo que realmente limita lo que pueden hacer.

También podría considerar volver a escribir como una aplicación web donde procesa todo lo que está en el servidor fuera de su alcance.

Sin embargo, ¿hay realmente un problema aquí, o solo estás siendo teórico?

2

Para los clientes de Winform que se conectan directamente a la base de datos, esta es una pregunta antigua (¿10 años más o menos?) Que puede que nunca se resuelva.

El problema es que no importa cómo encripte u oscurezca la cadena de conexión, siempre habrá un punto en el tiempo en que la cadena se representará como texto sin formato en la memoria de la computadora cliente y por lo tanto será pirateable.

Te han recomendado opciones de otros SOers, solo pensé en señalar lo que estás tratando de evitar.

Cuestiones relacionadas