Ver Mensaje Individual
  #13 (permalink)  
Antiguo 20/10/2011, 17:49
zedlp
 
Fecha de Ingreso: octubre-2011
Mensajes: 2
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: Evitar 2 ingresos simultaneos con el mismo usuario

Hola a todos, bueno sé que el hilo en viejo, pero con la necesidad y por lo leido se me ha ocurrido lo que creo sea una solución al asunto, lo dejo por si le puede servir a alguien que como yo ha necesitado el asunto:

Al lio,

Cuando el usuario1 hace login establecemos una array multidimensional con la variable de session $_SESSION de esta forma:

Código PHP:

   $idunico
=uniqid('user_'); //A esta variable debemos asignarle un valor unico aleatorio cada vez que se haga login.
   
$row['id']=1//Id del usuario obtenido desde la BD

   
$_SESSION['userid'][$row['id']]['conexiones'][$idunico]['IP']=GetUserIp(); //donde obtenemos la IP del usuario actual con la funcion de abajo.
   
$_SESSION['userid'][$row['id']]['conexiones'][$idunico]['ultimo_acceso']=time(); //La seteamos con la hora actual.



   
function GetUserIp()
    {
       
$ip "";
       if(isset(
$_SERVER)) {
        if (!empty(
$_SERVER['HTTP_CLIENT_IP'])) 
          {
             
$ip=$_SERVER['HTTP_CLIENT_IP'];
          } elseif (!empty(
$_SERVER['HTTP_X_FORWARDED_FOR'])) {
             
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
          } else {
             
$ip=$_SERVER['REMOTE_ADDR'];
          }
       } else {
         if ( 
getenv'HTTP_CLIENT_IP' ) ) {
           
$ip getenv'HTTP_CLIENT_IP' );
         } elseif ( 
getenv'HTTP_X_FORWARDED_FOR' ) ) {
           
$ip getenv'HTTP_X_FORWARDED_FOR' );
         } else {
           
$ip getenv'REMOTE_ADDR' );
      }
  } 
   
// En algunos casos muy raros la ip es devuelta repetida dos veces separada por coma 
   
if(strstr($ip,','))
    {
      
$ip array_shift(explode(',',$ip));
    }
   return 
$ip;
  } 
Con esto tenemos la posibilidad de que si hace login por ejemplo el usuario2 con la misma userid no sobreescriba la variable, sino que añada al array su ip y fecha actual.

Gracias a estos datos podremos en cada una de nuestras paginas hacer un checkeo de dicho array y comprobar si existe dentro del mismo $_SESSION['userid']['conexiones'] dos o mas valores [$idunico], si vemos que existe mas de 1 valor comprobamos la IP para ver que no sean iguales, y el time() para descartar aun mas. Por ejemplo podemos dar prioridad al time con mas anterioridad osea al usuario1 que fue el primero en logearse(como por ejemplo para enviarlo al login), yo personalmente lo que voy a hacer es forzar a un nuevo login si existe mas de un usuario logeado con la misma userid, y si el usuario reitera (por si comparte sus credenciales de acceso), baneo su cuenta por X horas

Vale he caido en la cuenta!, para que esto funcione las sesiones deben estar en la BD asi podremos consultar la info de las sesiones que se generen si no, no podras acceder a la informacion de otra sesion que no sea la que esta en curso ;-P

Esta claro que esto mismo se puede hacer directamente con otra tabla en la BD que haga un log y listo, pero serian mas peticiones a realizar, no obstante veo un poco de luz al final del tunel jejeje.

Creo haberme explicado , yo ahora lo estoy poniendo en practica y parece ser que va bien.

Ya os iré leyendo

Saludos a todos

Última edición por zedlp; 20/10/2011 a las 18:31 Razón: Se me ocurrieron mas cosillas para mejorarlo