none
Inicio proyecto. RRS feed

  • Pregunta

  • Hola a todos:

    Mas que una pregunta es para que me aconsejéis, tengo que iniciar un proyecto que será remitido a los clientes, por lo tanto quisiera que la cadena de conexión a la Base de Datos sea confidencial (a ser posible que este encriptada). ¿Debo de guardar la cadena de conexión (encriptada) en la configuración del proyecto?, si es así, ¿Que pasos debo de realizar?, ¿En que momento se guarda la cadena de conexión encriptada en la configuración del proyecto? y ¿En que momento se debe de desencriptar?.

    No sé, ¿Que me aconsejáis?

    Un saludo.

    viernes, 1 de marzo de 2019 9:52

Respuestas

  • El SqlConnectionStringBuilder se usa instanciando la clase, cambiandole las propiedades, y luego tomando el valor de ConnectionString te devuelve la cadena de conexion que ha ensamblado a partir de las propiedades. Si ya tienes la cadena de conexion en el AppConfig, una buena forma de inicializarlo es asignandole la cadena que ya tienes, y despues le cambias las propiedades que deban ser distintas a las que habia en el web.config.

    Dim cadenaExistente as String = ConfigurationManager.ConnectionStrings("miCadena").ConnectionString
    Dim scb As New SqlConnectionStringBuilder(cadenaExistente)
    scb.DataSource = "NuevoServidor" 'Similarmente cambiar cualesquiera propiedades se necesiten
    Dim cadenaAUsar as String = scb.ConnectionString
    
    

    • Propuesto como respuesta Pedro AlfaroModerator lunes, 4 de marzo de 2019 15:28
    • Marcado como respuesta rbs61 martes, 5 de marzo de 2019 9:58
    lunes, 4 de marzo de 2019 13:18

Todas las respuestas

  • No es buena idea. Aunque la cadena de conexión esté encriptada, el programa tiene que contener en su interior todo lo necesario para desencriptarla (de lo contrario no le serviría para nada). Por lo tanto, un usuario podría descompilar el programa o rodarlo con un depurador hasta encontrar el punto en que desencripta la cadena y tomar el valor desencriptado.

    La solución es replantear la arquitectura de forma que no importe que los usuarios conozcan la cadena. Esto significa que hay que asignar credenciales distintas a cada usuario, y configurar la seguridad de la base de datos de forma que ese usuario solo pueda acceder a sus propios datos y no a ninguno que no le corresponda. Tratar de impedírselo ocultando la cadena de conexión es inútil. Más pronto o más tarde (probablemente más pronto) alguien la desencriptará y entonces tendrás un problema gordísimo al no tener limitación de seguridad en la base de datos, pudiendo ese usuario acceder a datos de todos los demás.

    viernes, 1 de marzo de 2019 13:23
  • Hola Alberto, gracias por tu respuesta.

    Pensando en lo que me dices, la idea que se me ocurre es crear una base de datos exclusiva a cada cliente, pidiendo a la entrada de la aplicación la contraseña de la base de datos (por lo que deberá de ser dinámica y en tiempo de ejecución). Entonces ¿Como puedo componer la cadena de conexión?

    Data Source = xxx.xxx.xxx.xxx;Initial Catalog=BaseDatos;User ID=xxxxxxx;Password=xxxxxxxxx

    viernes, 1 de marzo de 2019 14:47
  • Si, la cadena de conexion tiene buen aspecto tal como la has escrito. Por supuesto cada una de las partes que tenga que ser cambiante puede venir de una variable, y luego concatenarlo todo junto. O mejor todavia, usa la clase SqlConnectionStringBuilder para construir la cadena dinamicamente, pasandole en sus propiedades los datos que necesites variar.
    viernes, 1 de marzo de 2019 16:47
  • Buenos días, Alberto.

    He estado buscando información de como usar la clase SqlConnectionStringBuilder, pero no acabo de entender su funcionamiento.

    Me podrías poner algunos ejemplos de como usar la clase SqlConnectionStringBuilder.

    * ¿Si tengo la cadena de conexión en la app.config, como puedo hacer que sea dinámica?

    * En el asistente para la configuración del TableAdapter, da la opción de excluir los datos confidenciales de la cadena de conexión. Si opto por esta opción, ¿Como puedo establecer la conexión en el código de la aplicación?

    Hasta ahora incluía los datos confidenciales en la cadena de conexión puesto que la aplicación solo se utiliza dentro de la empresa.

    un saludo.

    lunes, 4 de marzo de 2019 9:51
  • El SqlConnectionStringBuilder se usa instanciando la clase, cambiandole las propiedades, y luego tomando el valor de ConnectionString te devuelve la cadena de conexion que ha ensamblado a partir de las propiedades. Si ya tienes la cadena de conexion en el AppConfig, una buena forma de inicializarlo es asignandole la cadena que ya tienes, y despues le cambias las propiedades que deban ser distintas a las que habia en el web.config.

    Dim cadenaExistente as String = ConfigurationManager.ConnectionStrings("miCadena").ConnectionString
    Dim scb As New SqlConnectionStringBuilder(cadenaExistente)
    scb.DataSource = "NuevoServidor" 'Similarmente cambiar cualesquiera propiedades se necesiten
    Dim cadenaAUsar as String = scb.ConnectionString
    
    

    • Propuesto como respuesta Pedro AlfaroModerator lunes, 4 de marzo de 2019 15:28
    • Marcado como respuesta rbs61 martes, 5 de marzo de 2019 9:58
    lunes, 4 de marzo de 2019 13:18
  • Hola Alberto, primero darte las gracias por tu tiempo.

    Estos haciendo unas pruebas y en al app.config tengo lo siguiente:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <configSections>
        </configSections>
        <connectionStrings>
            <add name="AppPedidosClientes.My.MySettings.sCnnClientes" 
                connectionString="Data Source=xxxxxxxx;Initial Catalog=BaseDatosX;User ID=xxxxxxx"
                providerName="System.Data.SqlClient" />
        </connectionStrings>
        <startup>
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
        </startup>
    </configuration>

    como veras en connectionString no tengo la password.

    He creado un TableAdapter con el asistente.

       Private Sub MtUsuarios_Load(sender As Object, e As EventArgs) Handles MyBase.Load
          Me.TbUsuariosTableAdapter.Fill(Me.DsConsultas.tbUsuarios)
       End Sub
    
    pero (lógicamente) me da un error de inicio de sesión en el usuario 'clientes'

    lunes, 4 de marzo de 2019 14:24
  • Eso significa que te has dejado el tableAdapter configurado con su configuracion predeterminada, que lee la cadena de conexion "tal como esta" en el archivo .config. Por lo tanto, te da un error si la cadena no es absolutamente correcta y no tiene todos los datos requeridos.

    Si quieres poner solo algunos datos en el .config y suministrar los demas sobre la marcha, se necesitan varios pasos:

    1. Poner la cadena "parcial" en el .config
    2. Traer a memoria la cadena y cambiarle las partes que sean necesarias. Una buena forma de hacer esto es por mediacion de un SqlConnectionStringBuilder como hemos visto antes.
    3. Tomar esa cadena modificada y utilizarla en las partes del programa donde se acceda a los datos. Si dicho acceso se realiza mediante un TableAdapter, entonces hay que asignarle al TableAdapter esa cadena modificada.

    Y no, asi a bote pronto no se como se le asigna la cadena al TableAdapter. Yo suelo trabajar directamente con DataAdapters en lugar de encapsular los DataAdapters en un TableAdapter. Al DataAdapter se le pasa la cadena de conexion a traves del constructor. Probablemente el TableAdapter tiene algo parecido, pero no lo conozco de memoria.

    lunes, 4 de marzo de 2019 16:58