** 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
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: 29/Abril/2020 a las 05:59
Hola amigos soy nuevo en el foro, y apenas estoy aprendiendo ACCESS, tengo una duda estoy haciendo un proyecto con un login, y utilizo código VBA, si ingreso un usuario y su contraseña funciona bien y también si no coincide no permitir ingresa el problema es,que hay un método para ingresar y se utilizan los caracteres especiales "'" de coma simple, como podría bloquear dichos caracteres, que solo me permite caracteres Alfanuméricos, A-Z y del 0-9, y también que se bloque el copiar y pegar en textbox por si se quieren pasar de listos y copiar los caracteres especiales, 

He leído que se hace uso del evento KeyPress que utiliza los códigos ascii pero no se como podríaaplicarlo, espero puedan ayudarme o aconsejarme que otro método utilizar para darle más seguridad a mi proyecto.
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 3062
Enlace directo a este mensaje Enviado: 29/Abril/2020 a las 11:09
Hola
A ver que no me aclaro, quieres decir que si pones comilla simple te deja acceder, se salta la seguridad??

Si es asi entiendo que puede haber un fallo de diseño y lo correcto seria rediseñarlo.


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: 29/Abril/2020 a las 12:51
Publicado originalmente por WarriorGeardark WarriorGeardark escribió:

 y también que se bloque el copiar y pegar en textbox por si se quieren pasar de listos y copiar los caracteres especiales

Para esa parte existe una máscara de entrada predefinida llamada "Contraseña", puedes ponerla tanto en el campo de la tabla como en los controles textbox. Eso hará que sólo se muestren "*" e impedirá que se pueda hacer corta-pega
El saber no ocupa lugar, sólo tiempo
Arriba
emiliove Ver desplegable
Administrador
Administrador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 5694
Enlace directo a este mensaje Enviado: 29/Abril/2020 a las 15:02
Para entender lo que pasa deberías dar detalles de tu proyecto: hablar de como haces el login, y que código VBA usas.

Saludos.
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 6479
Enlace directo a este mensaje Enviado: 29/Abril/2020 a las 15:22
Hola!

Este código te hace lo que necesitas.

Private Sub Texto0_KeyPress(KeyAscii As Integer)

Select Case KeyAscii
'No permitir añadir caracteres especiales en Text Box
Case Asc("'"), Asc(""""), Asc("?"), Asc("@"), Asc("-"), Asc("_"), Asc("*"), Asc(":"), Asc(";"), Asc("´"), Asc("`"), Asc("+")
    KeyAscii = 0 'Cancelar
Case Else
    'permitir los demás
End Select

End Sub


Editado por mounir - 29/Abril/2020 a las 15:24
Un Saludo.
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: 30/Abril/2020 a las 07:11
Publicado originalmente por rokoko rokoko escribió:

Hola
A ver que no me aclaro, quieres decir que si pones comilla simple te deja acceder, se salta la seguridad??

Si es asi entiendo que puede haber un fallo de diseño y lo correcto seria rediseñarlo.


Gracias por responder, no me explique el login funciona como debería si pongo una comilla simple no se salta la seguridad más bien con las comillas simple se hace lo que llaman inyección sql, donde es que vulneran la seguridad en lo otros si esta seguro.
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: 30/Abril/2020 a las 07:13
Publicado originalmente por Dabellaso Dabellaso escribió:

Publicado originalmente por WarriorGeardark WarriorGeardark escribió:

 y también que se bloque el copiar y pegar en textbox por si se quieren pasar de listos y copiar los caracteres especiales

Para esa parte existe una máscara de entrada predefinida llamada "Contraseña", puedes ponerla tanto en el campo de la tabla como en los controles textbox. Eso hará que sólo se muestren "*" e impedirá que se pueda hacer corta-pega
Gracias por responder el campo de mi tabla tiene la mascara de entrada como contraseña al igual que el textbox del formulario todo se mira así ***** pero si se puede copiar de una pagina el código y lo puedo en el textbox.
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: 30/Abril/2020 a las 07:17
Publicado originalmente por emiliove emiliove escribió:

Para entender lo que pasa deberías dar detalles de tu proyecto: hablar de como haces el login, y que código VBA usas.

Saludos.
Muchas gracias por responder, por supuesto este el codigo de mi formulario login
Tengo dos funciones que evitan que pueda usar el ByPass y donde me desactiva la cinta de opciones
y tengo permisos para el usuario administrador y los que no lo son.
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



Editado por WarriorGeardark - 30/Abril/2020 a las 07:22
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: 30/Abril/2020 a las 07:21
Publicado originalmente por mounir mounir escribió:

Hola!

Este código te hace lo que necesitas.

Private Sub Texto0_KeyPress(KeyAscii As Integer)

Select Case KeyAscii
'No permitir añadir caracteres especiales en Text Box
Case Asc("'"), Asc(""""), Asc("?"), Asc("@"), Asc("-"), Asc("_"), Asc("*"), Asc(":"), Asc(";"), Asc("´"), Asc("`"), Asc("+")
    KeyAscii = 0 'Cancelar
Case Else
    'permitir los demás
End Select

End Sub
muchas gracias amigo eres un crack, con eso ya no me deja ingresar los caracteres especiales, y como podría evitar que copien y peguen en el textbox porque me fui a una pagina y copie el codigo con los caracteres especiales y si me deja pegarlo en el textbox.
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: 30/Abril/2020 a las 09:23
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
Xavi, un minyó de Terrassa

Mi web
Arriba
01loko Ver desplegable
Colaborador
Colaborador


Unido: 17/Agosto/2017
Localización: Santander
Estado: Sin conexión
Puntos: 807
Enlace directo a este mensaje Enviado: 30/Abril/2020 a las 09:58
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?

Recordar de que soy nuevo y estoy aprendiendo.
Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: La Gloria
Estado: Sin conexión
Puntos: 3849
Enlace directo a este mensaje Enviado: 30/Abril/2020 a las 15:35
Hola 01loko:

Los ascii 17 al 20 no tienen nada que ver con las teclas CTRL o similar, es decir, que el ctrl v lo vas a poder hacer y NO los puedes controlar por ASCII

Para controlarlo, debes mirar las propiedades del campo poniéndolo como password

O  hacerte una función similar a esta:

Private Sub NombreDeTuCampo_KeyDown(KeyCode As Integer, Shift As Integer)
    If Shift = acCtrlMask And KeyCode = vbKeyV Then KeyCode = 0
End Sub


Un saludo.

Luis


El Búho es un pajarraco
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 6479
Enlace directo a este mensaje Enviado: 30/Abril/2020 a las 17:50
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.
Un Saludo.
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
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
 Responder Responder Página  12>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable