En el capítulo de hoy, vamos a ver
como desarrollar un sistema de seguridad básico para el control de los
intentos erróneos de iniciar sesión. ¿Que quiere decir esto? Pues en la
práctica, que un usuario “x” podría indicar un máximo de n intentos de
iniciar sesión con una contraseña errónea antes de ser bloqueado y no
poder iniciar sesión en la aplicación.
Y… ¿Por qué es interesante desarrollar algo parecido a lo que
propongo? Pues básicamente por cuestiones de seguridad, dependiendo de
que tipo de datos queramos almacenar en nuestra BBDD, deberemos exigir
un nivel mas alto o mas bajo de seguridad. Claro que es un sistema de
seguridad un tanto básico, pero claro, TODO SUMA. Simplemente es ir
añadiendo capas de seguridad a nuestra aplicación.
Para llevar a cabo esta modificación en nuestro formulario de Login,
vamos a crear un módulo estándar donde copiaremos el procedimiento que
se encargará de bloquear a los usuarios en caso de sobrepasar los n
intentos fallidos de iniciar sesión en la aplicación. Y realizar unas
modificaciones en el módulo del formulario para controlar el número de
intentos fallidos al iniciar sesión.
Creo que no hay mucho mas que explicar. Así que vamos al lío…
Paso 1
El primer paso, será crear un módulo estándar, que guardaremos con el
nombre “bas_Seguridad_Sesion”. En el, copiaremos el siguiente
procedimiento:
Public Sub Block_Usuario(intUsuario As Integer)
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim strSQL As String
strSQL = "SELECT dbo_Usuarios.Activo " & _
"FROM dbo_Usuarios " & _
"WHERE ID_Usuario = " & intUsuario & ";"
Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset)
With rst
' Modificamos el registro
.Edit
.Fields("Activo").Value = False
' Actualizamos el registro
.Update
End With
' Cerramos el recordset
rst.Close
' Borramos los objetos
Set rst = Nothing
Set dbs = Nothing
End Sub
Este procedimiento, lo que va a hacer, es bloquear al usuario
definido en el argumento pasado al procedimiento. Con lo cual, dicho
usuario ya no aparecería en el combobox (desplegable) para su selección
como usuario que puede iniciar sesión en la aplicación.
Quedando de la siguiente manera…
Paso 2
El siguiente paso, es agregar una variable con la que controlar el número de intentos fallidos de iniciar sesión y una constante que indicará el número máximo de intentos fallidos que dispone el usuario antes de ser bloqueado. La variable y la constante, las colocaremos en la cabecera del módulo del formulario.Quedando de la siguiente manera…
Option Compare Database
Option Explicit
' Variable privada que controla los intentos de login fallidos
Private bytErrLogin As Byte
' Constante que almacena el número máximo de intentos fallidos
Private Const bytErrLoginMax As Byte = 3
Si analizamos un poco el código, vemos que:
- La variable que va a controlar el número de intentos se llama bytErrLogin de tipo byte.
- La constante que controla el número máximo de intentos, se llama bytErrLoginMax también de tipo byte y con un valor establecido de 3.
Paso 3
Ahora nos toca modificar el código del evento “Load” del formulario de login. Para iniciar la variable del controlador de intentos fallidos de inicio de sesión de usuario.
Private Sub Form_Load()
' Establecemos el valor de la variable que controla los
' errores de login...
bytErrLogin = 0
End Sub
Escribiendo estas líneas de código en el evento Load del formulario,
establecemos en “0” el contador de inicios de sesión fallidos, con lo
que cada vez se cierre y se vuelva a abrir el formulario el contador se
pone a 0.
Paso 4
Lo siguiente que vamos a hacer, es crear un procedimiento para
comprobar si el número de intentos fallidos de iniciar sesión, es igual
al número máximo de intentos fallidos establecido en la constante bytErrLoginMax.
Private Sub Comprueba_Intentos(bytErrLogin As Byte, _
intUsuario As Integer)
If bytErrLogin = bytErrLoginMax Then
' Mostramos el mensaje "Se ha superado el número máximo de intentos
' de inicio de sesión"
MsgBox "Se ha superado el número máximo de intentos de " & _
"inicio de sesión." & _
vbCrLf & vbCrLf & _
"Usuario : """ & Me.cbo_Usuario.Column(1) & """." & _
vbCrLf & vbCrLf & _
"El usuario ha sido bloqueado.", _
vbExclamation, "Inicio de sesión"
' Bloqueamos al usuario
Call Block_Usuario(intUsuario)
' Hacemos log del bloqueo del usuario
Call Log_Sesion(intUsuario, "El usuario ha sido bloqueado.")
With Me
' Actualizamos el combobox cbo_Usuario
.cbo_Usuario.Requery
' Borramos la contraseña
.txt_Password = ""
' Ocultamos la etiqueta
.lbl_Mensaje.Visible = False
End With
End If
End Sub
Si los valores de bytErrLogin y de bytErrLoginMax son iguales :
- Se mostrará un msgbox informando que el usuario x ha sido bloqueado por haber igualado el número máximo de intentos fallidos de iniciar una sesión de usuario.
- Seguidamente, el procedimiento, llamará a la función Block_Usuario para bloquear dicho usuario.
- Y por último, el procedimiento, llamará a la función Log_Session para insertar un registro en la tabla dbo_Log_Sesion con el mensaje “El usuario ha sido bloqueado”.
Paso 5
Habiendo creado ya el procedimiento para bloquear el usuario que exceda el número máximo de intentos fallidos de iniciar una sesión de usuario en nuestra aplicación, el procedimiento que controlará el número de intentos fallidos. Toca modificar el código del evento Click del botón Login.
Private Sub cmd_Login_Click()
Dim intUsuario As Integer
Dim strContraseña As String
intUsuario = Nz(Me.cbo_Usuario.Value, 0)
strContraseña = Nz(Me.txt_Password, "")
' Ocultamos la etiqueta
If Me.lbl_Mensaje.Visible = True Then Me.lbl_Mensaje.Visible = False
' Comprobamos si se ha seleccionado usuario
If Comprueba_Usuario = False Then Exit Sub
' Comprobamos si se ha introducido contraseña
If Comprueba_Contraseña = False Then Exit Sub
' Comprobamos el valor introducido para el usuario y su contraseña
If Me.txt_Password = Get_Contraseña(intUsuario) Then
' -------------------------------------------------------
' Aquí podemos insertar el código que queremos que se
' ejecute cuando iniciemos la sesión...
' -------------------------------------------------------
' Mostramos mensaje
MsgBox "Sesión de usuario iniciada", _
vbInformation, _
"Inicio de Sesión"
' Hacemos log del inicio de sesión
Log_Sesion intUsuario, "Inicio de sesión."
' Cerramos el formulario
DoCmd.Close acForm, Me.Name
Else
' Añadimos +1 a los intentos de login erróneos
intErrLogin = intErrLogin + 1
' Centramos el foco en el textbox
Me.txt_Password.SetFocus
' Mostramos mensaje en la etiqueta
Call MensajeEtiqueta("La contraseña introducida es errónea.")
' Hacemos log del inicio de sesión fallido
Call Log_Sesion(intUsuario, "Inicio de sesión erróneo.", strContraseña)
' Comprobamos los intentos de inicio de sesión
Call Comprueba_Intentos(intErrLogin, intUsuario)
End If
End Sub
Si os fijáis, únicamente hemos añadido el siguiente código al evento
cmd_Login_Click para controlar los intentos fallidos de inciar sesión.
' Comprobamos los intentos de inicio de sesión
Call Comprueba_Intentos(intErrLogin, intUsuario)
Pero, ¿Cual es el resultado de todo esto? Pues en las imágenes podéis ver el resultado…
En la tabla dbo_Log_Sesion, la inserción de 4 registros, uno
por cada uno de los intentos fallidos de iniciar sesión, y un cuarto
para informar que el usuario ha sido bloqueado.
No hay comentarios.:
Publicar un comentario