Foros del Web » Programando para Internet » PHP »

¿como evitar multisesion?

Estas en el tema de ¿como evitar multisesion? en el foro de PHP en Foros del Web. buenas tardes, pues ahora mi duda que les quisiera plantear es la siguiente: Ya tengo mi sistema trabajando correctamente, PERO el problema es que un ...
  #1 (permalink)  
Antiguo 05/02/2009, 18:20
Avatar de kurokishi  
Fecha de Ingreso: enero-2009
Ubicación: Tenochtitlán
Mensajes: 109
Antigüedad: 15 años, 3 meses
Puntos: 1
¿como evitar multisesion?

buenas tardes, pues ahora mi duda que les quisiera plantear es la siguiente:
Ya tengo mi sistema trabajando correctamente, PERO el problema es que un usuario puede iniciar sesion simultaneamente, he intentado restringirlo mediante una variable de sesion, pero como al entrar tratar de entrar desde otra computadora con la misma sesion al ser validos los argumentos lo deja pasar
Mi pregunta es como hacer para que cuando el usuario este dentro de la sesion no pueda iniciar simultaneamente y nuevamente su sesion y si se puede hacer con la variable de sesion.
Mi codigo es el siguiente:
Código PHP:
<?php
session_start
();
$_SESSION["existe"]='si';
$_SESSION['dentro']=0;//con esta sesion trato de hacer un 'flag' para ver que este dentro o no
If(isset($_POST["usuario"]) and isset($_POST["password"]) )
{
$usuario=$_POST["usuario"]; 
$pass=$_POST["password"];

$con=pg_connect("host=127.0.0.1 port=5432 user=postgres password=**** dbname=Curso");
if (!
$con
    {
        echo 
"<html>
                <head>
                    <link href='curso/nihongo.css' rel='stylesheet' type='text/css'>
                </head>    
                    <body background='curso/menu/fondo.jpg' oncontextmenu='return false'>
                    <p class='titulo'>¡ERROR al conectarse a la base de datos.</p>
                    </body>
            </html>"
;
    }
 else     
    {
    
$sql="SELECT c.usuario, c.nivel, i.nickname FROM comparacion c, id i WHERE c.usuario='$usuario' AND c.contrasena='$pass' AND c.usuario=i.usuario";
$query=pg_query($sql);

    If(
pg_num_rows($query)==1)
    {
        
$row=pg_fetch_array($query);
        
$_SESSION["usuario"]=$row[0];
        
$_SESSION["usuario"]=$row[1];
        
$_SESSION["usuario"]=$usuario;
        
$_SESSION["nivel"]=$row[1];
        
$_SESSION["nickname"]=$row[2];
        
        
        if (
$_SESSION["nivel"]=='f')
        {
            
header ('Location: curso/nihongo_aragon.php?modulo=inicio');
            
$_SESSION['dentro']++;//aumento mi variable para que sea 1 y se active cuando entre
            
exit;
        }
        elseif (
$_SESSION["nivel"]=='t')
        {
            
header ('Location: curso/sensei_aragon.php?modulo=inicio');
            
$_SESSION['dentro']++;
            exit;
        }
    }    
        else
        {
            
header ('Location: ../logerror.php');
            exit;
        }
    }
}
?>
Y la pantella principal es:

Código PHP:
<?php
session_start
();
$_SESSION['usuario'];
$_SESSION['nivel'];
$_SESSION['nickname'];
$_SESSION['dentro'];
include (
"seguridad.php");
if (isset (
$_SESSION['dentro'])>=1)
{
header ('Location: ../dentroer.php');
    exit;
}
elseif(
$_SESSION['dentro']<=1)
{
    echo 
"
<html>
<head>
<title>日本語 の オンライアン 教室。</title>
</head>
<body margin-top: 0px; oncontextmenu='return false' background='menu/fondo.jpg'>
    <center>
        <table width='1200' height='600'>
            <tr>
                <td  width='1200' colspan='2' height='130' background='menu/cabecera.jpg'>
                    
                </td>
            </tr>
                <tr>
                    <td width='180' height='75' valign='top' name='menu'>"
;
                        include (
"menu.php");
                echo 
"
                    </td>
                        <td width='1020' height='525'>
                    <iframe src='Lecciones/"
.$_GET["modulo"].".php' height='100%' width='100%' scrolling='auto' frameborder='0' allowtransparency>
                    </iframe>
            </td>
  </tr>
 </table>
 </center>
 </body>
</html>"
;
}
?>
Y al ser siempre 1 me lo deja pasar, espero me puedan ayudar.
De antemano gracias.
salu2!
  #2 (permalink)  
Antiguo 05/02/2009, 18:59
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 18 años
Puntos: 33
Respuesta: ¿como evitar multisesion?

kurokishi:

Cita:
pero como al entrar tratar de entrar desde otra computadora con la misma sesion al ser validos los argumentos lo deja pasar
Creo que cuando el usuario ingresa desde OTRA computadora
automaticamente se crea una nueva sesion con ID nuevo.

Pareciera que tu preocupacion radica en no permitir
que otra persona que por alguna razon u otra haya obtenido
los datos de ingreso de una persona x, ingrese desde otro sitio
y que al mismo tiempo la persona x se encuentra ingresado y
navegando en el sitio.
Si es asi, podrias utilizar la IP o EL navegador que normalmente utiliza
tu usuario y restringir el acceso con esas variables; sin embargo,
en este caso tu usuario se veria restringido a ingresar unicamente bajo esas condiciones.


Saludos
Franco
  #3 (permalink)  
Antiguo 05/02/2009, 19:26
Avatar de kurokishi  
Fecha de Ingreso: enero-2009
Ubicación: Tenochtitlán
Mensajes: 109
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: ¿como evitar multisesion?

entonces deberia crear una variable de sesion que contenga la ip?

Código PHP:
$_SESSION['ip']=$_SERVER['REMOTE_ADDR'
Y SOBRE ESTO HACER LA RESTRICCION??
y como le haria para hacer esta restriccion??
Código PHP:
if ($_SESSION['ip']!=$_SERVER['REMOTE_ADDR'])
{
echo 
"error";
}
else
{
entra

seria asi? la verdad no tengo idea si puedo utilizarlo asi.
de todas maneras gracias, checare esto y les aviso como fue.
  #4 (permalink)  
Antiguo 05/02/2009, 19:49
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 18 años
Puntos: 33
Respuesta: ¿como evitar multisesion?

kurokishi:

$_SESSION['ip']=$_SERVER['REMOTE_ADDR'];
if( $_SESSION[ip'] != "123.456.789.012") {
error
} else {
entrar
}

Recuerda que debes comparar la variable de sesion
con alguna IP que ya tengas guardada de tu usuario.
Asimismo, estarias limitando la entrada al sitio
fundamentado en IP.

Saludos
Franco
P.S. La verdad que en estos casos no necesitas crear variable de session
sino que una simple variable.
  #5 (permalink)  
Antiguo 06/02/2009, 11:19
Avatar de kurokishi  
Fecha de Ingreso: enero-2009
Ubicación: Tenochtitlán
Mensajes: 109
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: ¿como evitar multisesion?


Pues creo que se restringe demasiado al usuario.
Ya que al ser una pagina para la comunidad universitaria, al no tener algunos usuarios computadora propia o al estar mas tiempo en la escuela que en la casa usan cibercafes, y obviamente no van a tener siempre la misma computadora, por lo cual aunuqe el usuario sea el 'dueño' de la cuenta no va a poder entrar.
Gracias, seguire intentando otros metodos.
  #6 (permalink)  
Antiguo 06/02/2009, 12:08
 
Fecha de Ingreso: abril-2008
Ubicación: Montevideo - Uruguay
Mensajes: 156
Antigüedad: 16 años
Puntos: 5
Respuesta: ¿como evitar multisesion?

Hi !

Creo que se podria agregar un campo en la tabla llamado: "logged" (Campo binary o boolean) que cuando el usuario inicie sesion se haga un update a ese campo y se ponga en 1, cuando haga logout o pase X tiempo que se ponga a 0 nuevamente.

Para hacer el login, lo que deberas hacer es preguntar si el campo de la BD es 1, entonces ya está logueado :P

Espero te sea util (Hay que tener cuidado con lo del tiempo).

Saludos :)
__________________
--
Mi Portfolio Online! Visitalo!
--
  #7 (permalink)  
Antiguo 06/02/2009, 15:32
Avatar de kurokishi  
Fecha de Ingreso: enero-2009
Ubicación: Tenochtitlán
Mensajes: 109
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: ¿como evitar multisesion?

Interesante, no se me habia ocurrido plantearlo de esa forma. Lo intentare y les aviso como me fue.
gracias por sus consejos.
  #8 (permalink)  
Antiguo 06/02/2009, 15:42
Avatar de acoevil  
Fecha de Ingreso: julio-2008
Ubicación: localhost/colombia/sevillaValle.php
Mensajes: 1.123
Antigüedad: 15 años, 8 meses
Puntos: 32
Respuesta: ¿como evitar multisesion?

Precisamente como lo plantea Proguri se puede lograr
  #9 (permalink)  
Antiguo 06/02/2009, 15:53
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: ¿como evitar multisesion?

estaba buscando esa premisa hace tiempo, y una de mis ideas fue esa de poner un campo de estado de logeo en la base de datos, y que cambie cuando se logea o cierra sesion ... pero que pasaria si el usuario cierra su ventana sin presionar el boton "cerrar sesion", como actualizaria ese campo en mi base de datos cuando se cierre la ventana o quizas cuando cambie de url en la misma pagina?

saludos

Última edición por cesarpunk; 06/02/2009 a las 16:11
  #10 (permalink)  
Antiguo 06/02/2009, 17:31
Avatar de kurokishi  
Fecha de Ingreso: enero-2009
Ubicación: Tenochtitlán
Mensajes: 109
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: ¿como evitar multisesion?

Bueno, pues ya quedo, hice lo de poner otro campo con el valor booleano y al momento de entrar y salir hacer un UPDATE a este campo, sin embargo como dice cesarpunk cuando el usuario sale de forma 'abrupta' del sistema el campo queda seteado a '1' (logeado').
Hago unas pruebas con diversas funciones y aviso a ver si se puede cambiar el estado al cerrarse la ventana.
salu2!
  #11 (permalink)  
Antiguo 06/02/2009, 20:07
Avatar de kurokishi  
Fecha de Ingreso: enero-2009
Ubicación: Tenochtitlán
Mensajes: 109
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: ¿como evitar multisesion?

PUES AHORA SI QUEDO, y en cuanto a lo de resetear el campo de logeado, lo tuve que hacer mediante otros scripts, pidiendo que ingrese sus datos y si existe la borra, si no la sigue dejando igual, aunque para los usuarios sea engorroso es la unica forma que le halle para que los puedan entrar nuevamente si es que cierran de manera incorrecta la sesion.
Si llegan a saber de una forma mas pulcra, por favor, hagannoslo saber.
Gracias a todos por sus consejos.
Me fueron de gran ayuda!
  #12 (permalink)  
Antiguo 06/02/2009, 20:28
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: ¿como evitar multisesion?

Hola kurokishi,

La idea es que tengas un campo donde guardes la última actividad, y con otro script compare, si esa actividad es mayor a 30 minutos o el tiempo que defines, el campo se pone en 0.

Saludos
  #13 (permalink)  
Antiguo 09/02/2009, 15:37
Avatar de kurokishi  
Fecha de Ingreso: enero-2009
Ubicación: Tenochtitlán
Mensajes: 109
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: ¿como evitar multisesion?

Hola, pues eso de utilizar el tiempo para delimitar la sesion se me hace una idea bastante buena, el rpoblema es que como los usuarios de este curso son estudiantes, al momento de estar dentro de la maquina se ponen a chatear, buscar otras cosas en internet, etc. y dejan la pagina en el olvido durante un buen rato.
Es por eso que mejor opte que la sesion estuviera abierta hasta que el usuario se digne a hacerle caso a este, para que no este entrando a cada rato a la sesion.
De todas maneras gracias por sus consejos, me han sido de gran ayuda y me han ayudado a entender un poco mas coo resolver estos 'problemillas'.
Gracias a todos!
__________________
海賊王 に なろ!
  #14 (permalink)  
Antiguo 09/02/2009, 15:44
Avatar de ElJavista
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: Lima Perú
Mensajes: 2.231
Antigüedad: 17 años, 1 mes
Puntos: 67
Respuesta: ¿como evitar multisesion?

Yo te recomiendo algo, si el usuario abrutamente cierra la ventana sin cerrar sesión puedes usar el evento onunload del body y ejecutar una función con ajax, para cerrar la sesión. A mi me ha pasado que por el hecho de cerrarse la ventana no se ejecuta eso último, o no se termina de ejecutar a menos que haya una alerta, bien, haz eso, utiliza ajax y haz que al final se haga una alerta indicando que la sesión se va a cerrar. Espero que te sirva la idea.
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 16:22.