Foros del Web » Programando para Internet » PHP »

Evitar acceso simultáneo a sistema

Estas en el tema de Evitar acceso simultáneo a sistema en el foro de PHP en Foros del Web. Buenos días, esto más que consulta es una pequeña aportación a un tema que por varios años he buscado y leído sin llegar a una ...
  #1 (permalink)  
Antiguo 13/09/2013, 09:48
 
Fecha de Ingreso: agosto-2010
Mensajes: 105
Antigüedad: 13 años, 8 meses
Puntos: 3
Evitar acceso simultáneo a sistema

Buenos días, esto más que consulta es una pequeña aportación a un tema que por varios años he buscado y leído sin llegar a una buena solución, esto es el evitar que una persona le "pase" el usuario y contraseña a otros para entrar a un sistema hecho en php.

Si bien existen muchas maneras de evitar que alguien se firme (loguee, accese, entre, etc) de manera simultánea, el problema que he visto y que no se ha logrado resolver es el hecho de que el usuario salga de la aplicación cerrando directamente el navegador, o que se le fuera la luz o cosa similar, esto haría que la sesión se quede abierta.

Al igual que todos los que han aportado ideas, sigo en las mismas ante éste problema y he llegado a la conclusión de que por la limitante del manejo de sockets, tiempo de vida de sesiones y funciones es más bien un asunto que debemos resolver por medio de lóǵica.

Hay algunas maneras aunque muy rudimentarias que nos podrían ayudar a evitar las miles de llamadas al teléfono pidiendo que le desbloquees la cuenta:

1.- Evidentemente se requiere poner un enlace o botón para cerrar la sesión, algo que el usuario nunca usa.

2.- Todo usuario de un sistema de cómputo seguramente tendrá una cuenta de correo (dudo que no lo tuviera), en estos casos en mis desarrollos pido una cuenta de correo del usuario para hacerle llegar su contraseña cuando se registra.

3.- Crear una tabla "activo" por ejemplo que tenga 2 campos: "usuario" y "aleatorio", el campo usuario deberá ser único o primario (como quieran, para evitar duplicidad) en esta tabla se ingresará el nombre de usuario que entre al sistema y un número aleatorio de unos 4 dígitos (9,999 posibilidades)

Lógica de ingreso:
1.- Una vez que el usuario ingresa al sistema, creamos un número aleatorio de 4 dígitos, lo guardamos en una variable de sesión ($_SESSION['aleatorio'] por ejemplo) e ingresamos en la tabla “activo” el usuario y el número aleatorio. (en caso de que alguien ya se hubiese firmado con el mismo usuario se negaría el acceso ya que el campo es único o con una simple consulta a la tabla para saber si está el registro.

2.- Cada vez que el usuario ejecute una acción (consultar, actualizar, ingresar etc), el sistema deberá comprobar si el valor de la variable de session ($_SESSION['aleatorio'] por ejemplo) corresponde al que está en la tabla “activo” asignado al usuario en línea.

Hasta aquí nada nuevo para las ideas (aún mejores que esta) para evitar el acceso simultáneo, pero recuerden que mi idea es más de lógica que de codificación, repito: lo que quiero es evitar que me llamen a cada rato para desbloquear la cuenta.

Si simplemente desarrollamos una aplicación para que el usuario la libere ( es este ejemplo sería un código php para borrar el registro del usuario en la tabla “activo”) , cualquiera lo haría y tendría acceso al sistema, incluso sin sacar del mismo al primero que entró.

Aquí es donde saco provecho de los puntos anteriores:
Desarrollar una aplicación php en la que el usuario que cerró el navegador o se le fue la luz o se le quemó la computadora pueda liberar su cuenta de la siguiente manera:

a) Cuando ingrese el usuario y contraseña, el sistema revisará si en la tabla “activo” está dicho usuario, al encontrarlo lo canalizará a otra página o si gustan mostrar un vínculo o botón en esa misma página que ejecute un código el cuál envíe a su buzón de correo el número aleatorio que se creó en la sesión anterior (lógicamente en la tabla donde tengan los datos de sus usuarios deberá tener el correo electrónico), una vez enviada la solicitud llevas a tu usuario a una página donde pida ingresar el número recibido por correo.

b) Una vez recibido el código lo ingresará en el sistema y si coincide, ejecutará el código para borrar el registro en la tabla “activo” y lo llevas a la página de ingreso nuevamente donde se creará un nuevo número aleatorio.

Así de simple. Si le pensamos un poco sobre las posibilidades de “malicia” de los usuarios para loguearse simultáneamente no podrán con esta lógica (aunque compartan el correo electrónico) ya que cada acción que lleven a cabo comprueba el número aleatorio y si es porque cerraron el navegador, ya puede él mismo desbloquearla.

Es muy rudimentario, sencillo, pero ayudará en algo.
  #2 (permalink)  
Antiguo 13/09/2013, 10:05
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 9 meses
Puntos: 194
Respuesta: Evitar acceso simultáneo a sistema

No necesitas que el usuario la libere, puedes crear un job sql, o un cron que pregunte si cumple con las condiciones de "activo" cada x tiempo (5 minutos por ejemplo), en caso de no cumplirlas realizas la misma accion que sucede cuando el usuario da click en el logout.
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #3 (permalink)  
Antiguo 13/09/2013, 10:27
 
Fecha de Ingreso: agosto-2010
Mensajes: 105
Antigüedad: 13 años, 8 meses
Puntos: 3
Respuesta: Evitar acceso simultáneo a sistema

A quién le preguntas y basado en qué? eso está interesante pues no puede ser a la tabla, sino a una variable de sesion...
  #4 (permalink)  
Antiguo 13/09/2013, 11:39
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Evitar acceso simultáneo a sistema

Podrias usar en la tabla un campo tiempo cada vez que envie una peticion aztualizas el campo con el tiempo por ejemplo puedes usar time() . ahora bien si ami se me fue la luz y vuelvo a entrar a las 2 horas y yo deje la session abierta , ahora vuelvo a logearme y lo que deberias es verificar la hora de la ultima aztualizacion si es mayor a 2 horas por ejemplo lo deslogueamos y volvemos a mostrarle el panel de login .

igualmente lo que te dijo @h2swider es muy buena idea , yo la he utilizado.

Última edición por webankenovi; 13/09/2013 a las 11:46
  #5 (permalink)  
Antiguo 14/09/2013, 18:26
 
Fecha de Ingreso: agosto-2010
Mensajes: 105
Antigüedad: 13 años, 8 meses
Puntos: 3
Respuesta: Evitar acceso simultáneo a sistema

es buena idea usar el time, tendría que ser a 10 minutos pues si tú cierras el navegador o se va la luz no creo que te guste como usuario esperarte una hora...
Creo que los bancos usan algo similar, yo tengo que esperar 10 minutos si cierro el navegador.
Gracias por sus comentarios!
  #6 (permalink)  
Antiguo 14/09/2013, 18:40
Avatar de jgdev13  
Fecha de Ingreso: abril-2013
Mensajes: 40
Antigüedad: 11 años
Puntos: 4
Respuesta: Evitar acceso simultáneo a sistema

¿Qué tal WebSockets?, ¿me explico?
__________________
No intentes superar a nadie, ¡supérate a ti mismo!
  #7 (permalink)  
Antiguo 17/09/2013, 09:00
 
Fecha de Ingreso: agosto-2010
Mensajes: 105
Antigüedad: 13 años, 8 meses
Puntos: 3
Respuesta: Evitar acceso simultáneo a sistema

Cita:
Iniciado por jgdev13 Ver Mensaje
¿Qué tal WebSockets?, ¿me explico?
Pues no lo creo, solo veo que es para transferencia via TCP, comunicación bidireccional y nada más. Ya lo implementaste para el caso que expongo aquí?

Saludos y gracias.
  #8 (permalink)  
Antiguo 17/09/2013, 10:09
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Evitar acceso simultáneo a sistema

Tal como lo expones de los bancos es la mejor manera de hacerlo, lo que haces es guardas en una tabla cuando fue la última vez que realizó una acción, así en cada request actualizas ese campo, si el usuario cierra el navegador (o se le va la luz, o se quema su pc) revisas usando un Cron Job si el tiempo de actividad ha caducado (tiempo_última_actividad + "timeout" > tiempo_actual).

Si es así, lo deslogueas y no pasa nada, como bien dices los bancos usan un sistema igual, donde si no cierras usando el logout no puedes entrar hasta después de "timeout" minutos.

Etiquetas: registro, sistema, tabla, usuarios, variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:00.