Foros del Web » Programando para Internet » PHP »

Autentificator y sessiones

Estas en el tema de Autentificator y sessiones en el foro de PHP en Foros del Web. Hola foro. He modificado el script Autentificator de Cluster (espero que no te importe ) para que me guarde una cookie con los datos del ...
  #1 (permalink)  
Antiguo 03/09/2003, 16:03
Avatar de Sharak  
Fecha de Ingreso: diciembre-2002
Mensajes: 26
Antigüedad: 21 años, 4 meses
Puntos: 0
Pregunta Autentificator y sessiones

Hola foro.

He modificado el script Autentificator de Cluster (espero que no te importe ) para que me guarde una cookie con los datos del registro y asi ahorrar al usario que admita la cookie tener que registrarse siempre que entre en mi web.

Ahora surge un problema. Algunas veces (y algunos usuarios) hay problemas con el ingreso, el script muestra al usuario como no registrado (sin ningun error, es decir, es como si te hubieras registrado pero sin estarlo), cuando deberia estarlo y otras veces registra al usuario pero cuando introduce un archivo en la base de datos en esta aparece el nombre de usuario que lo ha introducido en blanco (el nombre de usuario entra en la BD por un query mediante $_SESSION['usuario_login']). Vamos que es como si la session no estuviera activa. No entiendo que puede pasar, ¿porque algunos si y otros no? Lo primero que se me ocurrió es que el cliente no aceptaba cookies pero según he planteado el script no deberia influir (lo único que ocurriría es que tendría que registrarse siempre que entrase).
Sólo me queda la posibilidad de que sea problema de las sessiones pero no se que problemas pueden dar, además tampoco se la configuracion del php.ini del servidor (wwwpuntocom).

A ver si alguien sabe que puede estar pasando. Os dejo el código por si tuviera algún fallo:

Código PHP:
<?php 
require ("aut_config.inc.php");
$url explode("?"$_SERVER['HTTP_REFERER']);
$pag_referida $url[0];
$redir $pag_referida;
// Grabamos los datos del usuario en una sesion.
// le damos un mobre a la sesion.
session_name($usuarios_sesion); 
// incia sessiones
session_start();
// Chequeamos si se está autentificandose un usuario por medio del formulario
if (isset($_POST['user']) && isset($_POST['pass'])) {
    
// Conexión base de datos.
    // si no se puede conectar a la BD salimos del scrip con error 0 y
    // redireccionamos a la pagina de error.
    
$db_conexion mysql_connect("$sql_host""$sql_usuario""$sql_pass") or die(header ("Location:  $redir?error=0"));
    
mysql_select_db("$sql_db"); 
    
// realizamos la consulta a la BD para chequear datos del Usuario.
    
$usuario_consulta mysql_query("SELECT * FROM $sql_tabla WHERE nick='".$_POST['user']."'") or die(header ("Location:  $redir?error=1")); 
    
// miramos el total de resultado de la consulta (si es distinto de 0 es que existe el usuario)
    
if (mysql_num_rows($usuario_consulta) != 0) {
        
// eliminamos barras invertidas y dobles en sencillas
        
$login $_POST['user']; 
        
// encriptamos el password en formato md5 irreversible.
        
$password md5($_POST['pass']); 
        
// almacenamos datos del Usuario en un array para empezar a chequear.
        
$usuario_datos mysql_fetch_array($usuario_consulta); 
        
// liberamos la memoria usada por la consulta, ya que tenemos estos datos en el Array.
        
mysql_free_result($usuario_consulta); 
        
// cerramos la Base de dtos.
        
mysql_close($db_conexion); 
        
// chequeamos el nombre del usuario otra vez contrastandolo con la BD
        // esta vez sin barras invertidas, etc ...
        // si no es correcto, salimos del script con error 4 y redireccionamos a la
        // página de error.
        
if ($login != $usuario_datos['nick']) {
            
Header ("Location: $redir?error=2");
            exit;
        } 
        
// si el password no es correcto ..
        // salimos del script con error 3 y redireccinamos hacia la página de error
        
if ($password != $usuario_datos['pass']) {
            
Header ("Location: $redir?error=3");
            exit;
        } 
        
// Guardamos la información en una cookie y destruimos las variables login y password usadas
        
setcookie("coNick"$usuario_datos['nick'], time() + 7776000);
        
setcookie("coPass"$usuario_datos['pass'], time() + 7776000);
        unset(
$login);
        unset (
$password); 
        
// Asignamos variables de sesión con datos del Usuario para el uso en el
        // resto de páginas autentificadas.
        // definimos usuarios_id como IDentificador del usuario en nuestra BD de usuarios
        
$_SESSION['usuario_id'] = $usuario_datos['ID']; 
        
// definimos usuario_nivel con el Nivel de acceso del usuario de nuestra BD de usuarios
        
$_SESSION['usuario_nivel'] = $usuario_datos['nivel_acceso']; 
        
// definimos usuario_nivel con el Nivel de acceso del usuario de nuestra BD de usuarios
        
$_SESSION['usuario_login'] = $usuario_datos['nick']; 
        
// definimos usuario_password con el password del usuario de la sesión actual (formato md5 encriptado)
        
$_SESSION['usuario_password'] = $usuario_datos['pass']; 
        
// Defino tambien el e-mail en la sesion
        
$_SESSION['usuario_email'] = $usuario_datos['email'];
        
// La variable exlogin vale para saber si el registro a sido exitoso o no y enviar al programa a una template o a otra segun el caso
        
$_SESSION['exlogin'] = true
        
// Hacemos una llamada a si mismo (scritp) para que queden disponibles
        // las variables de session en el array asociado $HTTP_...
        
$pag $_SERVER['PHP_SELF'];
        
Header ("Location: $pag");
        exit;
    } else {
        
// si no esta el nombre de usuario en la BD o el password ..
        // se devuelve a pagina q lo llamo con error
        
Header ("Location: $redir?error=2");
        exit;
    } 
} else {
    
// Chequeamos si estan creadas las variables de sesión de identificación del usuario,
    // El caso mas comun es el de una vez "matado" la sesion se intenta volver hacia atras
    // con el navegador.
    
if (!isset($_SESSION['usuario_login']) && !isset($_SESSION['usuario_password'])) {
        if (isset(
$_COOKIE['coNick']) && isset($_COOKIE['coPass'])) {
            
// Conexión base de datos.
            // si no se puede conectar a la BD salimos del scrip con error 0 y
            // redireccionamos a la pagina de error.
            
$db_conexion mysql_connect("$sql_host""$sql_usuario""$sql_pass") or die(header ("Location:  $redir?error=0"));
            
mysql_select_db("$sql_db"); 
            
// realizamos la consulta a la BD para chequear datos del Usuario.
            
$usuario_consulta mysql_query("SELECT * FROM $sql_tabla WHERE nick='".$_COOKIE['coNick']."'") or die(header ("Location:  $redir?error=1"));
            if (
mysql_num_rows($usuario_consulta) != 0) {
                
setcookie("coNick"$_COOKIE['coNick'], time() + 7776000);
                
setcookie("coPass"$_COOKIE['coPass'], time() + 7776000);
                
$usuario_datos mysql_fetch_array($usuario_consulta);
                
mysql_free_result($usuario_consulta);
                
mysql_close($db_conexion); 
                
// Asignamos variables de sesión con datos del Usuario para el uso en el
                // resto de páginas autentificadas.
                // definimos usuarios_id como IDentificador del usuario en nuestra BD de usuarios
                
$_SESSION['usuario_id'] = $usuario_datos['ID']; 
                
// definimos usuario_nivel con el Nivel de acceso del usuario de nuestra BD de usuarios
                
$_SESSION['usuario_nivel'] = $usuario_datos['nivel_acceso']; 
                
// definimos usuario_nivel con el Nivel de acceso del usuario de nuestra BD de usuarios
                
$_SESSION['usuario_login'] = $usuario_datos['nick']; 
                
// definimos usuario_password con el password del usuario de la sesión actual (formato md5 encriptado)
                
$_SESSION['usuario_password'] = $usuario_datos['pass']; 
                
// Defino tambien el e-mail en la sesion
                
$_SESSION['usuario_email'] = $usuario_datos['email'];
                
$_SESSION['exlogin'] = true
                
// Hacemos una llamada a si mismo (scritp) para que queden disponibles
                // las variables de session en el array asociado $HTTP_...
                
$pag $_SERVER['PHP_SELF'];
                
Header ("Location: $pag");
                exit;
            } else {
                
setcookie('coNick');
                
setcookie('coPass');
            } 
        } 
    } 


?>

Última edición por Sharak; 03/09/2003 a las 16:06
  #2 (permalink)  
Antiguo 03/09/2003, 22:43
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Me parece bien tus modificaciones .. (el scritp está licenciado bajo GPL .. así que puedes hacer lo que quieras con el ..)

Sobre el problema concreto .. Ahora no sé que decirte (no he probado exaustivamente el script completo) .. Pero, sobre el uso de sesiones .. ten en cuenta que por el tratamiento de sesiones que se usa (se asume el "SID" se propága de forma automática) .. Tus usuarios del sistema (en general todos los de Autentificator en sí ..) deben de tener activadas las COOKIES para que el SID se propage y a su vez tu servidor debe de usar las directivas del php.ini como sigue:

session.use_cookies =1
session.use_trans_sid =1

(usar cookie para propagar el SID (sinó no funciona redireccionamientos header() .. y popups de javascript .. en frames y demás habría que propagar el SID a mano. Tambien se usa la otra directiva para que PHP "sobreescriba" ciertos tag HTML con el SID para que sea propagado)

Intentan aislar el problema por "S.O." del cliente (del navegador) .. que Navegador usan .. si aceptan cookies y si pasa el problema con una cookie ya establecida que no se borró .. o como sea ..

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 04/09/2003, 06:46
Avatar de Sharak  
Fecha de Ingreso: diciembre-2002
Mensajes: 26
Antigüedad: 21 años, 4 meses
Puntos: 0
Ok.

Mi servidor no me deja poner un phpinfo() (tienen desabilitada esta funcion) pero ¿podria poner lo siguiente?

Código PHP:
ini_set("session.use_cookies","1");
ini_set("session.use_trans_sid","1"); 
Lo digo para asegurarme que el servidor tiene las condiciones que me dices.

En cuanto a los navegadores; todos los usuarios de la página usan IE (la ultima version). ¿Como se sabe si tu navegador admite o no cookies? Yo creia que era en la pestaña de seguridad y hay todos lo tenemos configurado igual y nos tendría que dar a todos el mismo error.

Gracias y un saludo.
  #4 (permalink)  
Antiguo 08/09/2003, 08:27
 
Fecha de Ingreso: junio-2003
Ubicación: Santiago
Mensajes: 105
Antigüedad: 20 años, 10 meses
Puntos: 1
Yo tambien tuve problemas con autentificator, aunque debo reconocer que, el problema era de mi PHP, pues cuando subi el script a mi servidor, funciono de inmediato en forma perfecta, cosa que hasta hoy, al intentar trabajar en forma local, tengo problemas.

Aprovecho el post para mostrar mi phpinfo(), en la seccion de las sessions para ver si me pueden decir que esta mal.

Directive Local Value Master Value
session.auto_start Off Off
session.bug_compat_42 Off Off
session.bug_compat_warn On On
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_lifetime 0 0
session.cookie_path / /
session.cookie_secure Off Off
session.entropy_file no value no value
session.entropy_length 0 0
session.gc_dividend 1000 1000
session.gc_maxlifetime 1440 1440
session.gc_probability 1 1
session.name no value no value
session.referer_check no value no value
session.save_handler files files
session.save_path /tmp /tmp
session.serialize_handler php php
session.use_cookies On On
session.use_only_cookies Off Off
session.use_trans_sid On On


Eso.
Ayuda porfa y gracias de ante mano.
Saludos!
  #5 (permalink)  
Antiguo 08/09/2003, 21:49
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
"Los problemas" que tienes en "local" deberías de indicarlos ..

Sólo mencionar una vez más que; además de la configuración mencionada (más arriba) .. Autentificator requiere que el navegador soporte cookies (y las acepte) pues el SID se asume que se propaga en modo automático ..

Por otro lado .. si usas Windows como S.O. en tu "local" .. la directiva:
session.sava_path = .. debería ser c:\php\sesiones .. o como lo quieras llamar pero, siempre un directorio que exista ..(y si usas windows 2000/NT que tenga permisos de escritura)

De todas formas .. esa directiva mál configurada arroja un error caracteristico, pero como no indicas ningún error .. no hago más que hacer congeturas.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
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 10:41.