** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Evitar acceso no autorizado
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoEvitar acceso no autorizado

 Responder Responder Página  12>
Autor
Mensaje Invertir el orden de clasificación
WarriorGeardark Ver desplegable
Nuevo
Nuevo


Unido: 29/Abril/2020
Localización: Mexico
Estado: Sin conexión
Puntos: 32
Enlace directo a este mensaje Tema: Evitar acceso no autorizado
    Enviado: 10/Junio/2020 a las 22:19
La respuesta de @jilo es la que me funciono ya pueden cerrar este hilo, gracias a todos por su ayuda.
Arriba
WarriorGeardark Ver desplegable
Nuevo
Nuevo


Unido: 29/Abril/2020
Localización: Mexico
Estado: Sin conexión
Puntos: 32
Enlace directo a este mensaje Enviado: 10/Junio/2020 a las 22:19
@jilo muchas gracias, me funciono de maravilla, ya con esto me puedo olvidar de que traten de copiar y pegar los caracteres inválidos, esta respuesta es la que me funciono.
Arriba
jilo Ver desplegable
Colaborador
Colaborador


Unido: 19/Diciembre/2004
Localización: TAFALLA
Estado: Sin conexión
Puntos: 959
Enlace directo a este mensaje Enviado: 10/Junio/2020 a las 08:11
Hola, Yo lo pondría al principio antes de evaluar sí es null el usuario y el password. Y la Funcion Comprueba la pondría en un módulo cualquiera.
Además manejando los datos con NZ puedes controlar si es nulo y podrías igual quitar los if isnull ya que sí es null no te pasará.
Tal que así
Private Sub Comando1_Click()
Dim OnOfRibbon As Integer
Dim OnOfShift As Integer

if Not Comprueba (nz(Me.txtUsuario," ")) Or Not Comprueba (nz(Me.txtPass," ")) then
  Msgbox "Caracteres no permitidos",,"Error"
  exit sub
End if

If IsNull(Me.txtUsuario) Then
'....


Espero te sirva !!!!!!
Iñaki
Arriba
WarriorGeardark Ver desplegable
Nuevo
Nuevo


Unido: 29/Abril/2020
Localización: Mexico
Estado: Sin conexión
Puntos: 32
Enlace directo a este mensaje Enviado: 10/Junio/2020 a las 01:40
gracias @jilo, lo voy a intentar disculpa mi ignorancia pero ¿Dónde colocaría este código en un modulo? o en el código de mi login, 
Cita
Private Sub Comando1_Click()
Dim OnOfRibbon As Integer
Dim OnOfShift As Integer

If IsNull(Me.txtUsuario) Then
        MsgBox "Por favor, escriba su Usuario", vbInformation, "Usuario requerido"
        Me.txtUsuario.SetFocus
    ElseIf IsNull(Me.txtPass) Then
        MsgBox "Por favor, ingrese su Contraseña", vbInformation, "Contraseña requerida"
        Me.txtPass.SetFocus
    Else
        If (IsNull(DLookup("[Usuario]", "Usuarios", "[Usuario] ='" & Me.txtUsuario.Value & _
        "' And Password = '" & Me.txtPass.Value & "'"))) Then
            MsgBox "Usuario y/o Contraseña incorrectos"
        Else
            OnOfShift = DLookup("Activar_Shift", "Usuarios", "Usuario = '" & Me.txtUsuario.Value & "'")
            OnOfRibbon = DLookup("Mostrar_Cinta_Opciones", "Usuarios", "Usuario = '" & Me.txtUsuario.Value & "'")
            
            UserLevel = DLookup("Admin", "Usuarios", "Usuario = '" & Me.txtUsuario.Value & "'")
            
            'Validación para Desactivar/Activar tecla Shift
            If OnOfShift = -1 Then
                    TeclaShift "AllowBypassKey", dbBoolean, True
                Else
                    TeclaShift "AllowBypassKey", dbBoolean, False
            End If
                        
                            'Validación para Mostrar/Ocultar la Cinta de Opciones
                            If OnOfRibbon = -1 Then
                                    DoCmd.ShowToolbar "Ribbon", acToolbarYes
                                Else
                                    DoCmd.ShowToolbar "Ribbon", acToolbarNo
                            End If
                            
             'Validación para identificar al Administrador
            If UserLevel = -1 Then
                LogedUser = Me.txtUsuario.Value
                LogedName = DLookup("NombreUsuario", "Usuarios", "Usuario = '" & Me.txtUsuario.Value & "'")
                LogedDeparted = DLookup("Departamento", "Usuarios", "Usuario = '" & Me.txtUsuario.Value & "'")
                DoCmd.Close
                DoCmd.OpenForm "Menu_Principal"
            Else
                LogedUser = Me.txtUsuario.Value
                LogedName = DLookup("NombreUsuario", "Usuarios", "Usuario = '" & Me.txtUsuario.Value & "'")
                LogedDeparted = DLookup("Departamento", "Usuarios", "Usuario = '" & Me.txtUsuario.Value & "'")
                DoCmd.Close
                DoCmd.OpenForm "Menu_Principal"
            End If
    End If
End If
End Sub

Private Sub Form_Load()
TeclaShift "AllowBypassKey", dbBoolean, False 'Desactiva la tecla Shift
DoCmd.ShowToolbar "Ribbon", acToolbarNo 'Oculta la Cinta de Opciones

Me.txtUsuario.SetFocus

End Sub

Private Sub txtUsuario_KeyPress(KeyAscii As Integer)
If (KeyAscii >= 97 And KeyAscii <= 122) Or (KeyAscii = 225) Or (KeyAscii = 233) Or (KeyAscii = 237) Or (KeyAscii = 241) Or (KeyAscii = 243) Or (KeyAscii = 250) Then
        KeyAscii = VBA.Asc(VBA.UCase(VBA.Chr(KeyAscii)))
    End If
End Sub
Arriba
jilo Ver desplegable
Colaborador
Colaborador


Unido: 19/Diciembre/2004
Localización: TAFALLA
Estado: Sin conexión
Puntos: 959
Enlace directo a este mensaje Enviado: 05/Junio/2020 a las 07:34
Hola,

En vez de ir caracter a caracter otra opción es usa el objeto expresiones regulares.

Te dejo una función que te devuelve falso sí en la cadena que le pasas hay alguno o varios caracteres que no sean letras MAY y/o MIN y/o numeros y he puesto tambien que permita el subguión.
Espero te sirva

Function Comprueba(cadena As String) As Boolean
   With CreateObject("VBScript.RegExp")
      .Pattern = "[^A-Za-z0-9_]"
      Comprueba = .Test(cadena)
   End With
   Comprueba = Not Comprueba
End Function



Editado por jilo - 05/Junio/2020 a las 07:36
Espero te sirva !!!!!!
Iñaki
Arriba
WarriorGeardark Ver desplegable
Nuevo
Nuevo


Unido: 29/Abril/2020
Localización: Mexico
Estado: Sin conexión
Puntos: 32
Enlace directo a este mensaje Enviado: 04/Junio/2020 a las 19:10
Oks @xavi, no sabía, apenas me estoy adaptando para utilizar el foro, no quiero causar molestias, gracias por decirme.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Enlace directo a este mensaje Enviado: 04/Junio/2020 a las 01:05
@WarriorGeardark: intenta evitar el abuso de citas. Citar el texto completo no aporta (casi) nada al mensaje. 

Este último mensaje tuyo es obvio que responde al inmediatamente anterior por lo que la cita es redundante.

El uso de las citas es más adecuado para extraer/contestar partes de un mensaje.

Gracias
Xavi, un minyó de Terrassa

Mi web
Arriba
WarriorGeardark Ver desplegable
Nuevo
Nuevo


Unido: 29/Abril/2020
Localización: Mexico
Estado: Sin conexión
Puntos: 32
Enlace directo a este mensaje Enviado: 04/Junio/2020 a las 01:00
Publicado originalmente por javier.mil javier.mil escribió:

Un pregunta: Con tu codigo original crees que te pueden injectar SQL y romper la seguridad ?
si es que vi un código básico que era usado en sitios web y se me dio la curiosidad de probarlo en mi proyecto de access y cuando lo ingrese en el login se paso la seguridad, y probe escribiendo un usuario que no existía y no pasaba, también con uno que si existia con la contraseña mala e igual no pasaba pero ese código se brinco el login, el proyecto lo tendré en una red que será local y se que no cualquier persona tendrá el acceso pero más que nada me salió esa inquietud para futuros proyectos.
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4812
Enlace directo a este mensaje Enviado: 04/Junio/2020 a las 00:36
Un pregunta: Con tu codigo original crees que te pueden injectar SQL y romper la seguridad ?
Arriba
WarriorGeardark Ver desplegable
Nuevo
Nuevo


Unido: 29/Abril/2020
Localización: Mexico
Estado: Sin conexión
Puntos: 32
Enlace directo a este mensaje Enviado: 04/Junio/2020 a las 00:25
Publicado originalmente por Dabellaso Dabellaso escribió:

No es más sencillo pasar el contenido del Textbox a una variable y analizar/limpiar esa variable con una de las funciones LimpiaTexto que hay por el foro antes de hacer el Lookup?. 

De ese modo, si el usuario se las ingenia de alguna manera para introducir caracteres como comas, asteriscos, apostrofes, signos "=", o palabras como True,  simplemente antes de hacer el DlookUp le echamos fuera. Así, esos caracteres nunca llegarán al SQL y no podrán inyectar código

La idea es comprar la cadena limpia con la cadena introducida, si no son iguales, es que la introducida tiene caracteres no permitidos y actuamos avisando, o cerrando o lo que queramos

Hace poco xavi puso varios ejemplos en este hilo:

A mi me gustó este:
Function LimpiaTexto3(strTexto As String) As String
    For i = 1 To Len(strTexto)
        If Mid(strTexto, i, 1) Like "[A-Za-z0-9]" Then
            LimpiaTexto3 = LimpiaTexto3 & Mid(strTexto, i, 1)
        End If
    Next
End Function


Como alternativa, antes de conceder el acceso, puedes comprobar la cantidad de registros que devuelve la consulta con el were introducido

Haciendo un DCount antes del DLookup

Si la consulte devuelve un solo registro, todo bien, si devuelve varios, puedes pensar que han inyectado y negar el acceso.

Ed.
Por dar ideas.... se me ocurre que si quieres, en lugar de buscar el usuario con una consulta, puedes buscarlo con un recordset, así evitas el tema se las inyecciones, y además puedes permitir cualquier carácter en el password o el usuario. (Esto último no lo he comprobado)


te agradezco la respuesta son buenas ideas, de usar variables en lugar de hacer de los DLookup, y con un recordset para evitar los inyecciones sql, pero no se como aplicarlo en código soy nuevo en esto de VBA, lei el hilo que citaste que igual me parecio bien pero no logre hacerlo funcionar.
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4812
Enlace directo a este mensaje Enviado: 04/Junio/2020 a las 00:24
Siempre he asociado las inyecciones SQL con bases de datos conectadas a sitios web públicos.
Nunca antes había considerado preocuparme por la inyección de SQL en aplicaciones de Access

He realizado algunas pruebas
En un cuadro de texto poniendo algo parecido a esto

JAVIER'; DROP TABLE tblUsuarios;


Y No he conseguido borrar ninguna tabla,....... ojo No digo que No sea posible ,........ pero parece raro que sea posible en Access.....

 

Arriba
WarriorGeardark Ver desplegable
Nuevo
Nuevo


Unido: 29/Abril/2020
Localización: Mexico
Estado: Sin conexión
Puntos: 32
Enlace directo a este mensaje Enviado: 03/Junio/2020 a las 19:52
Publicado originalmente por mounir mounir escribió:

Hola!

Y para desactivar el botón derecho del ratón para que no copie de un control (Text Box" de formulario:-

propiedades de formulario >>>>>> Pestaña Otros >>>>>>> Menú Contextual lo pones a "No"

así ya tienes todo lo que necesitas.
gracias eso hice solo me falta lo del teclado
Arriba
WarriorGeardark Ver desplegable
Nuevo
Nuevo


Unido: 29/Abril/2020
Localización: Mexico
Estado: Sin conexión
Puntos: 32
Enlace directo a este mensaje Enviado: 03/Junio/2020 a las 19:49
Publicado originalmente por 01loko 01loko escribió:

como pregunta:

si se  prohibe los codigos de control: del 17 al 20, ¿impide el ctrl+v?
y si es asi, el raton cuando das pegar ¿no manda ese codigo?

lo bloquee donde dice menú contextual, no se donde vi un comentario que decia eso, eso evita que pueda usar el copiar y pegar con click derecho.
Arriba
WarriorGeardark Ver desplegable
Nuevo
Nuevo


Unido: 29/Abril/2020
Localización: Mexico
Estado: Sin conexión
Puntos: 32
Enlace directo a este mensaje Enviado: 03/Junio/2020 a las 19:47
Publicado originalmente por xavi xavi escribió:

Hola,

Varias cosas

1. En tu código hay unas cuantas ineficiencias
- Evalúas el nulo (IsNull) pero no el vacío ni espacios en blanco. Yo utilizaría combinación de Trim y Nz
- Muchos DLookup. Para un usuario y password correctos, cuento hasta 5 DLookup para recuperar información. Eso es el equivalente a 5 consultas. Es mucho mas económico de recursos utilizar un recordset filtrado dónde valides los campos.
- Algunos If son obviables
  . TeclaShift "AllowBypassKey", dbBoolean, OnOfShift  (incluso la variable es obviable si utilizas un recordset)
- La validación de UserLevel no la pillo. Juraría que hace exactamente lo mismo.

2. Creo que no podrás impedir el Copy-Paste. Lo que si puedes es validar, en el BeforeUpdate del campo (que permite cancelar el evento), si hay caracteres prohibidos.
Se trataría de tener una función que recorra, carácter a carácter, el texto y compruebe si el valor está permitido. 

Algo así:

For i = 1 To Len(Me!CuadroTexto)
  Select Case Asc(Mid(Me!CuadroTexto, i,1))
    Case 48 To 57, 65 To 90, 97 To 122
        ' Caracteres permitidos. Mayúsculas, minúsculas y números
    Case Else
        ' Carácter NO permitido
        MsgBox "Texto contiene caracteres inválidos", vbCritical, "Aviso"
        Cancel = True
        Exit Sub
  End Select
Next

Escrito al vuelo

Un saludo
gracias lo tomare en cuenta tus consejos, apenas soy nuevo en esto de vba, buscare la forma de lograr un login mejor optimizado.
Arriba
Dabellaso Ver desplegable
Asiduo
Asiduo


Unido: 18/Noviembre/2012
Localización: España
Estado: Sin conexión
Puntos: 338
Enlace directo a este mensaje Enviado: 30/Abril/2020 a las 18:52
No es más sencillo pasar el contenido del Textbox a una variable y analizar/limpiar esa variable con una de las funciones LimpiaTexto que hay por el foro antes de hacer el Lookup?. 

De ese modo, si el usuario se las ingenia de alguna manera para introducir caracteres como comas, asteriscos, apostrofes, signos "=", o palabras como True,  simplemente antes de hacer el DlookUp le echamos fuera. Así, esos caracteres nunca llegarán al SQL y no podrán inyectar código

La idea es comprar la cadena limpia con la cadena introducida, si no son iguales, es que la introducida tiene caracteres no permitidos y actuamos avisando, o cerrando o lo que queramos

Hace poco xavi puso varios ejemplos en este hilo:

A mi me gustó este:
Function LimpiaTexto3(strTexto As String) As String
    For i = 1 To Len(strTexto)
        If Mid(strTexto, i, 1) Like "[A-Za-z0-9]" Then
            LimpiaTexto3 = LimpiaTexto3 & Mid(strTexto, i, 1)
        End If
    Next
End Function


Como alternativa, antes de conceder el acceso, puedes comprobar la cantidad de registros que devuelve la consulta con el were introducido

Haciendo un DCount antes del DLookup

Si la consulte devuelve un solo registro, todo bien, si devuelve varios, puedes pensar que han inyectado y negar el acceso.

Ed.
Por dar ideas.... se me ocurre que si quieres, en lugar de buscar el usuario con una consulta, puedes buscarlo con un recordset, así evitas el tema se las inyecciones, y además puedes permitir cualquier carácter en el password o el usuario. (Esto último no lo he comprobado)




Editado por Dabellaso - 30/Abril/2020 a las 20:08
El saber no ocupa lugar, sólo tiempo
Arriba
 Responder Responder Página  12>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable