Foros del Web » Programando para Internet » PHP »

Problemas con session_id()

Estas en el tema de Problemas con session_id() en el foro de PHP en Foros del Web. Hola a todos... Tengo un sistema de autentificación de usuarios que le permite escojer entre usar cookies, o simplemente usando sesiones. Las cookies en el ...
  #1 (permalink)  
Antiguo 10/05/2003, 12:24
Avatar de drcyber  
Fecha de Ingreso: julio-2002
Mensajes: 826
Antigüedad: 22 años, 3 meses
Puntos: 2
Pregunta Problemas con session_id()

Hola a todos...

Tengo un sistema de autentificación de usuarios que le permite escojer entre usar cookies, o simplemente usando sesiones. Las cookies en el sistema funcionan perfecto, pero las sesiones no. Este es basicamente el code, un archivo main.php donde se loguea el user, y un login.php donde se procesan los datos:

Código del formulario de logueo (visitante.php)
Código PHP:
<form method="post" action="login.php">
<
input type="text" name="user">
<
input type="password" name="password">
<
input type="checkbox" name="recordar" class="checkbox">
<
input name="submit" type="submit" class="submit" value="Ingresar">
</
form

Codigo del login.php
Código PHP:
<?php 
include('dbconn.php');

function 
qsimb($var) {
    
$var str_replace("<","&lt;",$var);
    
$var str_replace(">","&gt;",$var);
    
$var str_replace("\'","'",$var);
    
$var str_replace('\"',"&quot;",$var);
    
$var str_replace("\\\\","&#92",$var);
    return 
$var;
}

if(
trim($_POST['user']) != "" && trim($_POST['password']) != "") {

    
$userN qsimb($_POST['user']); 
    
$passN qsimb($_POST['password']); 

    
$ssql "SELECT * FROM usuarios WHERE usuario='$user'";
    
$rs mysql_query($ssql);

    if(
$row mysql_fetch_array($rs)) {
        if(
$row['password'] == $passN) {
            if(
$recordar == "on") {
                
setcookie("cookUser",$userN,time()+7776000);
                
setcookie("cookPass",$passN,time()+7776000);
            } else {
                
session_start();
                
$_SESSION['sUser'] = $userN;
                
$_SESSION['sPass'] = $passN;
            }
            
$msg "Ingreso exitoso, ahora será redirigido a la página principal...";
        } else {
            
$msg "Contraseña inválida.";
        } 
    } else {
        
$msg "Nombre de usuario no válido.";
    }
    
mysql_free_result($rs);
} else {
    
$msg "Debe especificar un nombre de usuario y contraseña."
}
mysql_close();
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="06334b" text="#FFFFFF">
<center>
<?php echo $msg ?>
<meta http-equiv="refresh" content="2;url=index.php?<?echo session_id(); ?>">
</center>
</body>
</html>

Codigo del main.php, para ver si esta logueado o no
Código PHP:
<?php
include('dbconn.php');

if(isset(
$_COOKIE['cookUser']) && isset($_COOKIE['cookPass'])) {
    
$ssql "SELECT * FROM usuarios WHERE usuario='".$_COOKIE['cookUser']."' AND password='".$_COOKIE['cookPass']."'";
    
$rs mysql_query($ssql);
    if(
$row mysql_fetch_array($rs)) {
        if(
$row['permisos'] == 0) {
            include(
'blocks/usuario.php');
        } else {
            include(
'blocks/moderador.php');
        }
    } else { 
        
setcookie("cookUser","x",time()-3600);
        
setcookie("cookPass","x",time()-3600);
    }
    
mysql_free_result($rs);
} else if(isset(
$_SESSION['sUser']) && isset($_SESSION['sPass'])) {
    
$ssql "SELECT * FROM usuarios WHERE usuario='".$_SESSION['sUser']."' AND password='".$_SESSION['sPass']."'";
    
$rs mysql_query($ssql);
    if(
$row mysql_fetch_array($rs)) {
        if(
$row['permisos'] == 0) {
            include(
'blocks/usuario.php');
        } else {
            include(
'blocks/moderador.php');
        }
    } else {
        
session_destroy();
    }
    
mysql_free_result($rs);
} else {
    include(
'blocks/visitante.php');
}
?>
El asunto es que no me quiere identificar la sesión, y en lugar de mostrarme usuario.php o moderador.php me muestra el formulario de logueo visitante.php.

¿Por qué?... ¿Por qué cuando imprimo session_id() me da "0" como ID?

Saludos y gracias !
__________________
Dr. Cyber
Ingeniarte.com
(soy el mismo Takitei)
  #2 (permalink)  
Antiguo 10/05/2003, 12:37
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
La propagación del SID no es correcta .. le falta el nombre de la session:

Código PHP:
<meta http-equiv="refresh" content="2;url=index.php?<?echo session_name()."=".session_id(); ?>">
Tambien podrías usar el SID como constante que es:
Código PHP:
<meta http-equiv="refresh" content="2;url=index.php?<?echo SID?>">
En el resto de links que tengas en el código que usas en los "include" .. habría que ver si propaga el SID así o no lo hace y lo asume como que lo propagaras en modo automático ..

Y lo ideal es que ahí redireccionara con cabeceras HTTP (header .. location ..) y no así .. Pero, bueno .. eso son otros detalles.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 11/05/2003, 13:01
Avatar de drcyber  
Fecha de Ingreso: julio-2002
Mensajes: 826
Antigüedad: 22 años, 3 meses
Puntos: 2
Ok Cluster, fíjate.

Hice lo que me dijiste:

<?php echo SID ?> y me pasa perfectamente el SESSION ID por la URL, pero... este code no se esta llevando a cabo, y la sesión ya esta abierta...

Código PHP:
} else if(isset($_SESSION['sUser']) && isset($_SESSION['sPass'])) {
    
$ssql "SELECT * FROM usuarios WHERE usuario='".$_SESSION['sUser']."' AND password='".$_SESSION['sPass']."'";
    
$rs mysql_query($ssql);
    if(
$row mysql_fetch_array($rs)) {
        if(
$row['permisos'] == 0) {
            include(
'blocks/usuario.php');
        } else {
            include(
'blocks/moderador.php');
        }
    } else {
        
session_destroy();
    } 
¿Qué estoy haciendo mal?

Thankz !
__________________
Dr. Cyber
Ingeniarte.com
(soy el mismo Takitei)
  #4 (permalink)  
Antiguo 11/05/2003, 13:38
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Y donde hace el session_start() ?

debería hacerlo antes de usar $_SESSION .. pues sino, lo que ves será un SID diferente al que se abrió para registrar esas variables de sesión.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 11/05/2003, 20:06
Avatar de drcyber  
Fecha de Ingreso: julio-2002
Mensajes: 826
Antigüedad: 22 años, 3 meses
Puntos: 2
El session_start() esta en login.php.

El asunto es que leí que debo pasar por URL el SID para que el sistema pueda saber la sesión con la que se está trabajando. De tal forma, que main.php pueda ejecutar el chequeo de sesiones que tiene en el code.

Algo estoy haciendo mal, pero NO SE QUE ES. Estoy basandome en lo que dice un libro de PHP, pero no sale.

Te cuento... con más detalle.

El usuario se loguea en el main.php, ahi se encuentra el formulario y puede seleccionar: USAR COOKIES, O NO.

Cuando se loguea usando cookies, el sistema (login.php) crea las cookies nuevas y reemplaza (main.php) el FORMULARIO por LOS DATOS DEL USUARIO (O MODERADOR) usando lo siguiente:

Código PHP:
if(isset($_COOKIE['cookUser']) && isset($_COOKIE['cookPass'])) {
    
$ssql "SELECT * FROM usuarios WHERE usuario='".$_COOKIE['cookUser']."' AND password='".$_COOKIE['cookPass']."'";
    
$rs mysql_query($ssql);
    if(
$row mysql_fetch_array($rs)) {
        if(
$row['permisos'] == 0) {
            include(
'blocks/usuario.php');
        } else {
            include(
'blocks/moderador.php');
        }
    } else { 
        
setcookie("cookUser","x",time()-3600);
        
setcookie("cookPass","x",time()-3600);
        include(
'blocks/formulario.php');
    }
    
mysql_free_result($rs);

Eso funciona perfectamente... pero con las sesiones no. Cuando el usuario se loguea usando las sesiones, el formulario se dirige a login.php donde se define la sesión de esta forma:

Código PHP:
if($recordar == "on") {
                
setcookie("cookUser",$userN,time()+7776000);
                
setcookie("cookPass",$passN,time()+7776000);
            } else {
                
session_start();
                
$_SESSION['sUser'] = $userN;
                
$_SESSION['sPass'] = $passN;
            } 
Luego, hace un REFRESH hacia: main.php?<?php echo SID ?> pasando el ID por URL.

main.php debería detectar que la sesión existe de esta forma:

Código PHP:
} else if(isset($_SESSION['sUser']) && isset($_SESSION['sPass'])) {
    
$ssql "SELECT * FROM usuarios WHERE usuario='".$_SESSION['sUser']."' AND password='".$_SESSION['sPass']."'";
    
$rs mysql_query($ssql);
    if(
$row mysql_fetch_array($rs)) {
        if(
$row['permisos'] == 0) {
            include(
'blocks/usuario.php');
        } else {
            include(
'blocks/moderador.php');
        }
    } else {
        
session_destroy();
        include(
'blocks/formulario.php');
    }
    
mysql_free_result($rs);

Pero no lo hace, se salta ese IF ya que "SUPUESTAMENTE" las variables $_SESSION['sUser'] y $_SESSION['sPass'] no están definidas...

¿Qué hago mal?

Espero haberme explicado, cualquier cosa... pegas un grito !
__________________
Dr. Cyber
Ingeniarte.com
(soy el mismo Takitei)
  #6 (permalink)  
Antiguo 11/05/2003, 20:52
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
En main.php parece que te falta iniciar el uso de sesiones:

session_start() ..
pues sino, cuando llega al elseif($_SESSION .. ) la sesion no se ha inicializado con el SID que podría estarse propagando de tu login.php

osese, en tu main.php debes de usar session_start() antes de que entre a usar $_SESISION ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #7 (permalink)  
Antiguo 11/05/2003, 21:27
Avatar de drcyber  
Fecha de Ingreso: julio-2002
Mensajes: 826
Antigüedad: 22 años, 3 meses
Puntos: 2
Dios...

Llevo 3 días luchando con eso, y simplemente era eso !...

Realmente me falto leer esta parte del libro:

"Cuando comienza una sesión se consulta si el script ha recibido un identificador de sesión o no. En caso afirmativo, se continúa con la sesión que coincide con dicho identificador. En otro caso, se crea una nueva sesión".

¿Qué te parece?
__________________
Dr. Cyber
Ingeniarte.com
(soy el mismo Takitei)
  #8 (permalink)  
Antiguo 11/05/2003, 21:54
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Pues así es el "mundo de las sesiones" ..

El hecho de propagar el "SID" es simplemente para comprobación "interna" de PHP y saber si ha de seguir con una sesión activa o bien crear una nueva.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #9 (permalink)  
Antiguo 11/05/2003, 21:58
Avatar de drcyber  
Fecha de Ingreso: julio-2002
Mensajes: 826
Antigüedad: 22 años, 3 meses
Puntos: 2
Cluster...

Hubo una parte donde por error olvidé propagar el SID, y sin embargo detectó la sesión...

¿Se debe a que está usando el session.use_cookies = 1, cierto?
(archivo php.ini)
__________________
Dr. Cyber
Ingeniarte.com
(soy el mismo Takitei)
  #10 (permalink)  
Antiguo 11/05/2003, 22:14
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Si, así es .. es más .. deberías desactivar el propagar el SID en una cookie si ya lo propagas tu manualmente ..

Imagina que uso tu sistema en modo "sesiones" por qué uso un navegador que no acepta cookies o simplemente no quiero mas cookies ..

En ese caso, el sistema funcionaría pues el SID lo propagas manualmente .. pero por "optimización" deberias de decidirte por un método (cookies o URL) para propagar el SID y así "forzar" tus scripts que funcionen como tu indiques ..

Con la función:
ini_set() puedes "forzar" el estado de esas directivas (php.ini) a tu manera de funcionar de tu script ... (si las usas .. tienes que hacerlo antes de usar session_start() ...). En las FAQ's hay un ejemplo si mal no recuerto de uso.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #11 (permalink)  
Antiguo 11/05/2003, 22:20
Avatar de drcyber  
Fecha de Ingreso: julio-2002
Mensajes: 826
Antigüedad: 22 años, 3 meses
Puntos: 2
Si, en un principio habia pensado pasar el SID por URL. Precisamente por eso me creé un sistema de LOGIN con sesiones para aquellos usuarios que no quieren cookies.

Lo mejor es pasar el SID siempre por URL, de tal forma que cuando publique la web en el server, no importaría el SETUP del mismo.

Saludos y muchísimas gracias por tu ayuda.
__________________
Dr. Cyber
Ingeniarte.com
(soy el mismo Takitei)
  #12 (permalink)  
Antiguo 12/05/2003, 01:23
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Pero .. propagar el SID por el URL tiene sus "problemillas" .. sobre todo de seguridad. Aunque con PHP 4.3.0 en adelante se está mejorando mucho ese tema. Tambien parte por la configuración que tengas de tu servidor en el apartado "sesiones"

Osese .. que todo tiene sus "pro y sus contras" ..

De todo esto hablé un poco sobre el tema en este mensaje:
http://www.forosdelweb.com/showthrea...hreadid=128638

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #13 (permalink)  
Antiguo 12/05/2003, 10:31
Avatar de drcyber  
Fecha de Ingreso: julio-2002
Mensajes: 826
Antigüedad: 22 años, 3 meses
Puntos: 2
Uff que rollo. Siempre la bendita seguridad.

... ¿Qué me recomiendas Cluster? ...
... ¿Qué te dicta la experiencia? ...

Pensaba usar el trans_sid para pasar el SID por las URLs sin necesidad de hacerles <?php echo SID ?> a cada link, pero este funciona solo para las siguientes tags:

url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeent ry"

Y tengo un refresh:

Código PHP:
<meta http-equiv="refresh" content="2;url=index.php"
Entonces, ¿cómo forzo mediante ini_set que soporte el refresh también?

Otra cosita...

En mi index.php coloqué el session_start(), el asunto es que si recargo la página "n" veces, se crean "n" sesiones !!!... y no puedo pasar el ID por URL, ya que es un INDEX.

¿Qué controlador me recomiendas para que no haga solo una sesión?
__________________
Dr. Cyber
Ingeniarte.com
(soy el mismo Takitei)

Última edición por drcyber; 12/05/2003 a las 10:45
  #14 (permalink)  
Antiguo 12/05/2003, 19:47
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
La reescritura de <tag> se refiere a "tag" HTML .. no a opciones de alguno como los "META" .. en esos casos particulares como ese, los header("location: pagina.php") y redireccionamiento javascrip (window.location o window.open ... por ejemplo) debes de propagar el SID tu a mano como ya lo haces.

Si quieres olvidarte de propagar el SID en todos los casos .. deberías usar propagación via COOKIES del SID con los problemas que conlleva toparte con un navegador que no las acepte ...

Lo más "seguro" vendría a ser propagar el SID en una cookie .. pues en ningún momento estarías propagando tu SID a un enlace externo a tu sítio con el "peligro" que ello podría conllevar. (aunque como .. creo que te comenté .. ese tema en PHP 4.3.0 en adelante han mejorado la seguridad al revisarse el "referere" de quien creó el SID para evitar un "contra - uso" de tu própio sid desde otro sitio ..)

El problema de tu "index" donde haces un sesion_start() y todavía no estas propagando un SID como para que siga usandose este .. usando propagación del SID via cookies se solventa ese "detallito" .. pues PHP a la priméra recarga envia la cookie al cliente con el SID y esté ya es usado para el resto de "recargas" ...

De todas formas .. esas sesiones nuevas .. segun tengas los tiempos de expiración configurados .. deberían pasar tras una recarga de tu página al modo "garbage" (o "basura") .. así que quedan sin funcionalidad y en espera de que sean borrados físicamente del servidor según determinen las directivas que controlan el "garbage".

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 12/05/2003 a las 19:53
  #15 (permalink)  
Antiguo 12/05/2003, 19:50
Avatar de drcyber  
Fecha de Ingreso: julio-2002
Mensajes: 826
Antigüedad: 22 años, 3 meses
Puntos: 2
Pues, entonces usaré cookies, el que no las tengas habilitadas se jo$ió.

Gracias Cluster.
__________________
Dr. Cyber
Ingeniarte.com
(soy el mismo Takitei)
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 12:15.