none
conexión a diferentes bases de datos RRS feed

  • Pregunta

  • hola muy buenos tardes este mi primer post porque no e encontrado nada en google, bueno mi consulta es :

    estoy creando una aplicación web pero es para diferentes empresas osea que la cadena de conexión la database cambia 

    yo lo tengo asi 

    "cuando pasa por el txt ingreso a la base de datos que deseo" 

    Protected Sub txtempresa_TextChanged(sender As Object, e As EventArgs) Handles txtempresa.TextChanged
            If txtempresa.Text.Equals("") = False Then
                Try

                    cn = New SqlConnection("Data Source=WIN-JH5M7UNHCIK\SQLEXPRESS;Initial Catalog='" & txtempresa.Text & "' ;User ID=user;Password=1q2w3e")

                    cn.Open()
                    ' MsgBox("Se ha conectado correctamente :)")

                    Response.Write("<script language='javascript'> alert('DataBase verificada'); </script>")
                Catch ex As Exception
                    Response.Write("<script language='javascript'> alert('Error en la base de Datos verifique su informacion '); </script>")
                End Try

            End If

        End Sub

       

    "y aquí inicio sesión "

    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            database = txtempresa.Text
            user = txtID.Text
            pass = txtPass.Text
            Dim numero As Integer
            Dim SqlData01 As DataView = DirectCast(SqlDataSource1.Select(DataSourceSelectArguments.Empty), DataView)
            If txtempresa.Text = "" Then
                Response.Write("<script language='javascript'> alert('INGRESE RUT DE SU EMPRESA'); </script>")
            ElseIf txtID.Text = "" Then
                Response.Write("<script language='javascript'> alert('INGRESE SU USUARIO'); </script>")
            ElseIf txtPass.Text = "" Then
                Response.Write("<script language='javascript'> alert('INGRESE SU CONTRASEÑA'); </script>")
            ElseIf SqlData01.Count > 0 Then
                numero = 1
            End If
            If numero = 1 Then

                comando.Connection = conexion
                Response.Write("<script language='javascript'> alert('Bienvenido'); </script>")

                Response.Redirect("MenuPrincipal.aspx")
                Session("RutEmpresa") = database

            Else
                Response.Write("<script language='javascript'> alert('Error en el ingreso de sesión intente nuevamente '); </script>")
                Response.Redirect("login.aspx")
            End If



        End Sub

    bueno todo bien asta hay pero necesito enviar el dato o el nombre de la base de datos a dos lugares mas a mi clase conexion y web config pero no se como pensé en sessiones pero no me resulta y no se ocurre como porfa ayuda estoy desesperado   

    de antemano muchas gracias 

    miércoles, 11 de mayo de 2016 16:35

Respuestas

  • Tal como lo tienes, existe una vulnerabilidad aquí:

    cn = New SqlConnection("Data Source=WIN-JH5M7UNHCIK\SQLEXPRESS;Initial Catalog='" & txtempresa.Text & "' ;User ID=user;Password=1q2w3e")

    Si concatenas un dato que ha tecleado el usuario en la cadena de conexión, te arriesgas a que te hagan un ataque inyectando un valor que altere la cadena. Por ejemplo, podrían cambiar el Data Source, y tendría prioridad el último y conseguirían conectarse a otro servidor y ejecutar contra él programa (pudiendo, por ejemplo, emitir una factura "ficticia" que no se contabilizaría en el programa "real").

    En lugar de concatenar los datos, usa un SqlConnectionStringBuilder, metiéndole el nombre de la base de datos en la propiedad oportuna. Además, haz validaciones sobre el txtEmpresa antes de aceptarlo. Por ejemplo, si sabes que los nombres de empresa siempre son abreviaturas de 3 letras, cerciórate de que realmente llegan 3 letras y no ninguna otra cosa.

    En cuanto a lo de pasar la base de datos a otros sitios, tales como una clase, utiliza el Session. Guarda la "empresa actual" en el Session y luego utilízala en todos los sitios en los que la necesites leyendo el Session (que en una clase sería HttpContext.Current.Session). Del web.config olvídate. Solo sirve cuando la base de datos es constante y no cambia.

    miércoles, 11 de mayo de 2016 16:46

Todas las respuestas

  • Tal como lo tienes, existe una vulnerabilidad aquí:

    cn = New SqlConnection("Data Source=WIN-JH5M7UNHCIK\SQLEXPRESS;Initial Catalog='" & txtempresa.Text & "' ;User ID=user;Password=1q2w3e")

    Si concatenas un dato que ha tecleado el usuario en la cadena de conexión, te arriesgas a que te hagan un ataque inyectando un valor que altere la cadena. Por ejemplo, podrían cambiar el Data Source, y tendría prioridad el último y conseguirían conectarse a otro servidor y ejecutar contra él programa (pudiendo, por ejemplo, emitir una factura "ficticia" que no se contabilizaría en el programa "real").

    En lugar de concatenar los datos, usa un SqlConnectionStringBuilder, metiéndole el nombre de la base de datos en la propiedad oportuna. Además, haz validaciones sobre el txtEmpresa antes de aceptarlo. Por ejemplo, si sabes que los nombres de empresa siempre son abreviaturas de 3 letras, cerciórate de que realmente llegan 3 letras y no ninguna otra cosa.

    En cuanto a lo de pasar la base de datos a otros sitios, tales como una clase, utiliza el Session. Guarda la "empresa actual" en el Session y luego utilízala en todos los sitios en los que la necesites leyendo el Session (que en una clase sería HttpContext.Current.Session). Del web.config olvídate. Solo sirve cuando la base de datos es constante y no cambia.

    miércoles, 11 de mayo de 2016 16:46
  • muchas gracias 

    la verdad sigo complicado con el tema pero lo intentare =)

    miércoles, 11 de mayo de 2016 19:07