Foros del Web » Programando para Internet » PHP »

Problema con las cookies

Estas en el tema de Problema con las cookies en el foro de PHP en Foros del Web. Tengo implementado un sistema de registro de usuarios con sesiones que me funciona perfectamente, pero ahora tocaba añadir la opción, mediante una casilla de verificación, ...
  #1 (permalink)  
Antiguo 21/11/2005, 19:01
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 14 años, 6 meses
Puntos: 3
Problema con las cookies

Tengo implementado un sistema de registro de usuarios con sesiones que me funciona perfectamente, pero ahora tocaba añadir la opción, mediante una casilla de verificación, de que el usuario quiera que se le recuerde el login y password en su equipo, y claro, lo ideal es hacerlo con cookies.

Pues me estoy haciendo un lío y no consigo hacer que funcione. Tal vez esté planteándolo mal. Os comento más o menos cómo lo hago:

Primero hago una lectura de SID, si la hay, y una condición que se cumple si se acaba de hacer un log in:

Código PHP:
@$us_registrado $_SESSION['us_registrado'];
if (isset(
$_POST["log_in"]) && isset($_POST["password"]))
// Se acaba de enviar el formulario de log in
{
     ..... 
// Conexión base de datos y validar usuario
           // Si casilla "recordar" activada, guardar una cookie:
          
if (isset($_POST["recordar"])) {
                
setcookie('loginMiWeb',"$log_in,$password",false);
            }


Dentro de la condición externa, también dependerá que se cree la sesión o no si el usuario es válido, mediante $_SESSION['us_registrado'] = $log_in;

Y lo que más quiero remarcar de dentro de esta condición, porque lo que me falla es la cookie, es si en el formulario se ha activado la casilla "recordar", poner una cookie en el equipo. Lo reescribo de nuevo pero la he escrito arriba, el if interno:

Código PHP:
if (isset($_POST["recordar"])) {
                
setcookie('loginMiWeb',"$log_in,$password",false);
            } 
Tras la condición principal, otra condición que comprueba si ya había una sesión creada y aún no se ha hecho la desconexión. Si es así, se muestra el usuario conectado y el botón de desconexión:

Código PHP:
if (isset($_SESSION['us_registrado']) && !isset($_POST["desconectar"])) 
{
... 
// Mostrar usuario conectado y botón de log out

Y tras este segundo if, un else con tres if's anidados que comprueban:
1- Si se ha hecho log out, con lo que se hace un unset para destruir la sesión.
2- Si el usuario no es válido, indicándolo en pantalla.
3- La opción por defecto: usuario desconectado o no registrado.

Si se da el else arriba remarcado en negrita, se ha de mostrar junto con una de esas tres subcondiciones el formulario de conexión/registro nuevo usuario (por tanto se mostrará si el usuario acaba de hacer log out, si no es válido, o si no ha hecho login o no está registrado).

Pues el quid de la cuestión es lo que hago después en el formulario mediante HTML+PHP para que aparezcan los valores de log_in y password en el caso de que se haya marcado la opción recordar: (pongo sólo el ejemplo del campo log_in o nombre de usuario para acortar y porque es análogo al del password)

Código PHP:
<input name="log_in" type="text" size="15" value="<?php if (isset($_COOKIE["loginMiWeb"])) 
                { 
                
$partes explode(',',$_COOKIE["loginMiWeb"]);
                echo 
$partes[0];
                }
                
?>"/>
Lo del explode() lo hago porque en el valor de la cookie si veis arriba almaceno el log_in y el password separados por una coma, y explode() lo que hace es almacenar en elementos de un array las subcadenas de la cadena pasada separadas por el separador especificado (en este caso la coma).Para obtener el log_in leo $partes[0], y para ontener el password leería $partes[1].

Bien, alguien bien entendido en esto me puede decir si hago algo mal qué es? o la mejor forma de hacerlo? Venga chicos, una ayudita!
  #2 (permalink)  
Antiguo 22/11/2005, 04:05
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 14 años, 6 meses
Puntos: 3
Porfa! Alguien me ayuda? Sé que he escrito bastante, pero lo he puesto bastante claro para que se entienda qué es lo que quiero decir.

Si no, símplemente decidme cómo haríais vosotros la opción de recordar el usuario y password en un equipo con las cookies, en rasgos generales, o con un ejemplo.
  #3 (permalink)  
Antiguo 22/11/2005, 05:50
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Deberías indicar el código completo .. no se vé donde usas session_start() .. también se vé que usas @ en algunas declaración de variables .. eso oculta los posibles mensaje de error que obtegas, así que si tienes algún detalle por ahí nunca lo veras ..

Cita:
Primero hago una lectura de SID, si la hay, y una condición que se cumple si se acaba de hacer un log in:
El SID es el "Identificador único de sesión" .. realmente lo que tu validas no es el SID sino una variable de tu sesión en curso (OK, viene "atada" por el SID .. pero no es el termino a emplear cuando haces referencia a una validación de cierta variable de sesión en tu sesión activa).


Un saludo,
  #4 (permalink)  
Antiguo 22/11/2005, 06:14
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 14 años, 6 meses
Puntos: 3
Bueno, el caso es que la lectura de la variable de sesión la hago antes de cualquier salida de código HTML, como tiene que ser no? Pero no es la sesión lo que me importa, ya que eso funciona bien. Se conecta cuando hace el login un usuario válido, se desconecta bien, aparece un error cuando no es un usuario válido, e impide el acceso a determinadas secciones a estos.

El problema está en la cookie que utilizo para almacenar el usuario (yo lo llamo log_in) y password y recuperarlos en los campos correspondientes si se ha elegido esta opción.
  #5 (permalink)  
Antiguo 22/11/2005, 06:26
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
El problema está en la cookie que utilizo para almacenar el usuario (yo lo llamo log_in) y password y recuperarlos en los campos correspondientes si se ha elegido esta opción.
Pues insisto .. yo así no veo nada claro tu proceso .. No sé ni como gestionas tu contraseñas (las encriptas? van "planas"?) .. ni como las "inyectas" de tus cookies si existen a tu autentificación como para crear la sesión y continuar con esta (es así como lo haces?).

Tampoco entiendo por qué usas un campo de un formulario y ahí le incrustras como valor tu cookie (que va la contraseña y el usuaario "serializado" a tu manera). Por lo menos el código completo de todos los scritps que intervengan en el proceso + tu explicación serviría para que nos hagamos una idea o te aportemos sugerencias.

La validación (el psudo-código o flujo) sería algo así:
1) Verificas la existencia de tus variables de sesión ... lo cual indicará una sesión activa o no.
1) Si no existe la sesión: Verificas tus valores (usuario/password) de tu cookie.
Si existe, usastes la opción "recordar" .. Tomas tus valores de tu cookie y en base a esos autentificas (contra tu BD o donde gestiones tus usuarios) y generas las variables de sesión como de costumbre. El sistema seguirá validando principalmente por tus variables de sesión y usará las sesiones para todo su proceso de tu aplicación.
3) No sé si usaras el mismo script para la autentificación desde tu formulario HTML de login .. pero si es así atacará esa validación al mismo proceso que haces si tomas los valores de tu cookie.

Un saludo,
  #6 (permalink)  
Antiguo 22/11/2005, 06:53
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 14 años, 6 meses
Puntos: 3
Bueno, pues pongo el código del login entero.
Se encuentra en un archivo llamado login.php, que es incluido con include() en un <DIV> de index.php, con lo cual es ejecutado siempre.

Este es el código:

Código PHP:
<?php 
        
@$us_registrado $_SESSION['us_registrado'];
        echo 
'<h1>Cuenta de usuario:</h1>';
        if (isset(
$_POST["log_in"]) && isset($_POST["password"]))
        
// Se acaba de enviar el formulario de log in
        
{
            @
$log_in $_POST["log_in"];
            @
$password $_POST["password"];
            @
$recordar $_POST["recordar"];
            
            
// Si se ha marcado la casilla recordar, poner una cookie en ese equipo para recordar
            
if (isset($_POST["recordar"])) {
                
setcookie('loginWebVN',"$log_in,$password",false);
            }
            
            @
$link mysql_connect('localhost''registrador''passwordDelRegistrador');
            if (!
$link) {
                   die(
'No se ha podido conectar al servidor. Error: ' mysql_error());
            }
            @
$db mysql_select_db('auth'$link);
            if (!
$db) {
                die(
'Error en el acceso a la base de datos. Inténtalo más tarde. Error<br />'.mysql_error());
            }
            
            
$query "SELECT * FROM authorized_users WHERE name='".$log_in."' AND password='".sha1($password)."'";
            @
$result mysql_query($query$link);
            if (!
$result) {
                   die(
'Error en la consulta: ' mysql_error());
            }
            
$num_results mysql_num_rows($result);
            
            if (
$num_results 0) {
                
// Se ha encontrado alguna coincidencia. Usuario válido. Se crea variable de sesión.
                
$_SESSION['us_registrado'] = $log_in;
                                                   
// Se vacían las vbles del login para no repetir este proceso
                
unset($_POST["log_in"]);
                unset(
$_POST["password"]);
            }
            
            
mysql_free_result($result);
            
mysql_close($link);
        }

        if (isset(
$_SESSION['us_registrado']) && !isset($_POST["desconectar"])) 
        {
            
// Ya se ha registrado el usuario actual y no ha hecho log out
?>  
            <form name="registrado" method="post" action="index.php">
                <p>Usuario conectado:<br /> 
                  <strong><?php echo $_SESSION['us_registrado']; ?></strong>
                  <input type="hidden" name="desconectar" value="on">
              </p>
                <p><input name="logout" type="submit" id="logout" value="Log out"></p>
            </form>
<?php 
        

        else 
        { 
// El usuario no es válido y ha intentado conectarse, o acaba de hacer log out, o no ha hecho login ni registro
            
if (isset($_POST["desconectar"])) {
                
// Se ha hecho log out. Destruimos la variable de sesión.
                
unset($_SESSION['us_registrado']);
            }
            
            if (isset(
$log_in) || isset($password)) {
                
// Aunque no tenemos id de sesión, hay valores en los campos del log in, o sea: usuario no válido
                
echo '<strong>Usuario o contraseña incorrectos.</strong><br />';
            } 
            
            else {
                
// Usuario que no se ha conectado aún, o ha hecho log out
                
echo 'Usuario desconectado o no registrado.<br />';
            }    
?>
             <form name="form2" method="post" action="index.php">
                 <table width="100%" border="0">
                  <tr>
                    <td>Conexi&oacute;n:</td>
                    <td>&nbsp;</td>
                  </tr>
                  <tr>
                    <td>log in</td>
                    <td><input name="log_in" type="text" size="15" value="<?php if (isset($_COOKIE["loginWebVN"])) 
                                                                                { 
                                                                                        
$partes explode(',',$_COOKIE["loginWebVN"]);
                                                                                        echo 
$partes[0];
                                                                                }
                                                                                
?>"/>
                                                                                </td>
                  </tr>
                  <tr>
                    <td>password</td>
                    <td><input name="password" type="password" size="15" value="<?php if (isset($_COOKIE["loginWebVN"])) 
                                                                                { 
                                                                                        
$partes explode(',',$_COOKIE["loginWebVN"]);
                                                                                        echo 
$partes[1];
                                                                                        }
                                                                                
?>"/>
                                                                                </td>                  </tr>
                  <tr>
                    <td><div class="Estilo1">
                      <div>Recordar en este equipo (necesita
                    tener cookies habilitadas): </div>
                    </div></td>
                    <td><input name="recordar" type="checkbox" id="recordar" value="true" /></td>
                  </tr>
                  <tr>
                    <td colspan="2"><div align="center">
                      <input name="signIn" type="submit" id="signIn" value="Enviar" />
                    </div></td>
                  </tr>
                </table>
</form>
            <form name="form1" method="post" action="index.php">
                    Usuario no registrado: 
                    <input name="registro" type="submit" id="registro" value="Registrarse">
                    <input type="hidden" name="registrar" value="on">
                    <br>
            </form>
<?php 
        
}
?>
Por lo que entiendo de lo que dices, se ve que hago mal el manejo de la cookie, que es mi pregunta.

A ver si con todo el código me puedes tu o algún otro corregir el error. Como digo, quiero que cuando seleccione la casilla de recordar, posteriormente aparezcan el nombre de usuario y password en sus respectivos campos y sólo sea necesario hacer click en el botón de conexión.
  #7 (permalink)  
Antiguo 22/11/2005, 07:08
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Te vuelvo a insistir...

Cuando uno está en fase de desarrollo, no puede usar @ delante de funciones/declaración de variabels .. si tienes algún problema por ahí o que derive ahí nunca lo veras.

SI ese es tu código completo .. NO se vé por ningún lado un session_start() antes de pretender acceder a una variable de sesión (o es que usas: session.auto_start a ON en tu php.ini? o lo defines mas arriba de donde llamas a este código: confirmarlo) .. Por ende, no sé ni como accedes correctamente al valor de tus variables de sesión.

La cookie no deberías definirla nada más recibir tus datos de login .. sino al Validar contra tu BD (consulta SQL) que el usuario/password existe.

Teóricamente (no he seguido bien el flujo del script):
if (isset($log_in) || isset($password)) {

ahí siempre estará definida esas dos variables por qué lo haces antes en:
@$log_in = $_POST["log_in"];
@$password = $_POST["password"];
@$recordar = $_POST["recordar"];

deberías usar empty() en lugar de isset() para asegurate "contenido" no existencia sólo. y a ser posible . .usa directamente $_POST .. o $_SESSION o $_COOKIE para evitar confusión de nombres de variables y método por el que las recibes en ese script.

Por lo demás .. me lio siguiendo tu script .. no veo claro el uso de las cookies para "recordar" al usuario.

Un saludo,
  #8 (permalink)  
Antiguo 22/11/2005, 07:50
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 14 años, 6 meses
Puntos: 3
Cluster, si te fijas, donde uso @ hago control de errores con die(). Símplemente es una forma más elegante de mostrar el error. Excepto en las declaraciones de nombres cortos para las variables de formulario, que en realidad no tendrían que dar ningún error (en mi servidor símplemente me salía un "Notice:" indicándome que tal vez se le podría asignar un valor inexistente, cosa que arreglaba con el @). Pero en el resto de líneas donde uso @ es en las funciones de bases de datos, y fíjate que aunque evite el error por defecto del servidor, hago después una validación y si hay error lo muestro de forma personalizada con el die(). Además, en mi servidor de hosting (no el local) tienen la opción de errores desactivada por motivos de seguridad, por eso uso die(), para poder ver el error.

El session_start() se encuentra al principio de index.php. Como he dicho, he puesto el código de login.php que va incluido dentro de index.php. Bueno, ha sido un error mío no haberlo avisado antes. Pero estar está. Al inicio de index.php

Te he hecho caso en lo de definir la cookie tras la validación del usuario, eso es verdad, no debería ser antes. Reescribo el código tras este cambio, y también he usado !empty en lugar de isset:

Código PHP:
<!-- el session_start() se encuentra al inicio del archivo index.php. Lo siguiente es el archivo login.php incluído en una sección DIV de index.php -->
<?php 
        
@$us_registrado $_SESSION['us_registrado']; 
        echo 
'<h1>Cuenta de usuario:</h1>'
        if (!empty(
$_POST["log_in"]) && !empty($_POST["password"])) 
        
// Se acaba de enviar el formulario de log in 
        

            @
$log_in $_POST["log_in"]; 
            @
$password $_POST["password"]; 
            @
$recordar $_POST["recordar"]; 
             
            @
$link mysql_connect('localhost''registrador''passwordDelRegistrador'); 
            if (!
$link) { 
                   die(
'No se ha podido conectar al servidor. Error: ' mysql_error()); 
            } 
            @
$db mysql_select_db('auth'$link); 
            if (!
$db) { 
                die(
'Error en el acceso a la base de datos. Inténtalo más tarde. Error<br />'.mysql_error()); 
            } 
             
            
$query "SELECT * FROM authorized_users WHERE name='".$log_in."' AND password='".sha1($password)."'"
            @
$result mysql_query($query$link); 
            if (!
$result) { 
                   die(
'Error en la consulta: ' mysql_error()); 
            } 
            
$num_results mysql_num_rows($result); 
             
            if (
$num_results 0) { 
                
// Se ha encontrado alguna coincidencia. Usuario válido. Se crea variable de sesión. 
                
$_SESSION['us_registrado'] = $log_in
                                                                   
// Si se ha marcado la casilla recordar, poner una cookie en ese equipo para recordar 
                
if ($_POST["recordar"]=='si') { 
                    
setcookie('loginWebVN',"$log_in,$password",false); 
                } 
                
// Se vacían las vbles del login para no repetir este proceso 
                
unset($_POST["log_in"]); 
                unset(
$_POST["password"]); 
            } 
             
            
mysql_free_result($result); 
            
mysql_close($link); 
        } 

        if (!empty(
$_SESSION['us_registrado']) && $_POST["desconectar"]!="on"
        { 
            
// Ya se ha registrado el usuario actual y no ha hecho log out 
?>   
            <form name="registrado" method="post" action="index.php"> 
                <p>Usuario conectado:<br /> 
                  <strong><?php echo $_SESSION['us_registrado']; ?></strong> 
                  <input type="hidden" name="desconectar" value="on"> 
              </p> 
                <p><input name="logout" type="submit" id="logout" value="Log out"></p> 
            </form> 
<?php 
        

        else 
        { 
// El usuario no es válido y ha intentado conectarse, o acaba de hacer log out, o no ha hecho login ni registro 
            
if ($_POST["desconectar"] == "on") { 
                
// Se ha hecho log out. Destruimos la variable de sesión. 
                
unset($_SESSION['us_registrado']); 
            } 
             
            if (!empty(
$log_in) || !empty($password)) { 
                
// Aunque no tenemos id de sesión, hay valores en los campos del log in, o sea: usuario no válido 
                
echo '<strong>Usuario o contraseña incorrectos.</strong><br />'
            } 
             
            else { 
                
// Usuario que no se ha conectado aún, o ha hecho log out 
                
echo 'Usuario desconectado o no registrado.<br />'
            }     
?> 
            <form name="form2" method="post" action="index.php"> 
                <table width="100%" border="0"> 
                  <tr> 
                    <td>Conexi&oacute;n:</td> 
                    <td>&nbsp;</td> 
                  </tr> 
                  <tr> 
                    <td>log in</td> 
                    <td><input name="log_in" type="text" size="15" value="<?php if (!empty($_COOKIE["loginWebVN"])) 
                                                                                { 
                                                                                        
$partes explode(',',$_COOKIE["loginWebVN"]); 
                                                                                        echo 
$partes[0]; 
                                                                                } 
                                                                                
?>"/> 
                                                                                </td> 
                  </tr> 
                  <tr> 
                    <td>password</td> 
                    <td><input name="password" type="password" size="15" value="<?php if (!empty($_COOKIE["loginWebVN"])) 
                                                                                { 
                                                                                        
$partes explode(',',$_COOKIE["loginWebVN"]); 
                                                                                        echo 
$partes[1]; 
                                                                                        } 
                                                                                
?>"/> 
                                                                                </td>                  </tr> 
                  <tr> 
                    <td><div class="Estilo1"> 
                      <div>Recordar en este equipo (necesita 
                    tener cookies habilitadas): </div> 
                    </div></td> 
                    <td><input name="recordar" type="checkbox" id="recordar" value="si" /></td> 
                  </tr> 
                  <tr> 
                    <td colspan="2"><div align="center"> 
                      <input name="signIn" type="submit" id="signIn" value="Enviar" /> 
                    </div></td> 
                  </tr> 
                </table> 
</form> 
            <form name="form1" method="post" action="index.php"> 
                    Usuario no registrado: 
                    <input name="registro" type="submit" id="registro" value="Registrarse"> 
                    <input type="hidden" name="registrar" value="on"> 
                    <br> 
            </form> 
<?php 
        

?>
  #9 (permalink)  
Antiguo 22/11/2005, 08:39
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cluster, si te fijas, donde uso @ hago control de errores con die(). Símplemente es una forma más elegante de mostrar el error. Excepto en las declaraciones de nombres cortos para las variables de formulario, que en realidad no tendrían que dar ningún error (en mi servidor símplemente me salía un "Notice:" indicándome que tal vez se le podría asignar un valor inexistente, cosa que arreglaba con el @). Pero en el resto de líneas donde uso @ es en las funciones de bases de datos, y fíjate que aunque evite el error por defecto del servidor, hago después una validación y si hay error lo muestro de forma personalizada con el die(). Además, en mi servidor de hosting (no el local) tienen la opción de errores desactivada por motivos de seguridad, por eso uso die(), para poder ver el error.

Con el @ delante .. el error se sigue originando (en los log's de tu servidor lo verías) .. Me refiero a los "Notice" que mencionas. Su uso "correcto" sería:

Código PHP:
if (isset($_POST['variable']){
// usas dicha variable ...

Así te haces independiente de la configuración sobre reporte de errores (error_reporting) que PHP pueda usar según el servidor que toque ese código.

Es decir .. no ocultar su mensaje de error sino tratandolo (en ese caso .. en las funciones mysql_xxx() y demás ya veo que lo controlas).

Cita:
El session_start() se encuentra al principio de index.php. Como he dicho, he puesto el código de login.php que va incluido dentro de index.php. Bueno, ha sido un error mío no haberlo avisado antes. Pero estar está. Al inicio de index.php
OK, tema aclarado.

-----------------------------------------------

Sobre la definción de tu cookie:
setcookie('loginWebVN',"$log_in,$password",false);

Define un tiempo de expiración:
Código PHP:
setcookie("TestCookie"$valuetime()+3600);  // una hora .. define lo que estimes oportuno 
Para no tener que "invetar" una serialización de datos como has hecho, podrías usar la modalidad de registro de "array" en tu cookie:

http://www.php.net/manual/en/function.setcookie.php

Ahora .. no sé por qué creas una cookie donde guardas en ella un "password" (que según alcanzo a ver NO está encriptado, pese que tu almacenas o creas a tus usuarios encritado con el hash: sha1 (se usa mucho el MD5() ... como comentario), pero luego sólo tomas el nombre del usuario para recordarlo (no piensas recordar el login completo al sistema? .. sólo necesitas eso? ...)

Un saludo,
  #10 (permalink)  
Antiguo 22/11/2005, 09:53
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 14 años, 6 meses
Puntos: 3
Bueno, lo de usar @ donde yo lo uso será cosa de formas de programación, porque te aseguro que esa es la que he aprendido en el libro de PHP y MySQL de Luke Welling y Laura Thomson. Te equivocas en ciertos aspectos, porque en mi error_log del servidor donde estoy alojado te aseguro que no aparece el aviso Notice si pongo @. Igual que evito el error en pantalla si lo tengo deshabilitado así en php.ini, evito el error en el log si pongo a off la visualización de errores en pantalla y habilito el archivo log de errores. Si no de qué serviría @? @ por lo que sé es una directiva para el manejo de errores y para que se puedan personalizar y visualizar de una forma más "elegante".

Pero a ver, yo en el fondo lo que quisiera saber es cual es la forma usual de implementar esto de "recordar los datos de conexión del usuario", aunque no tenga nada que ver con cómo lo intento hacer yo. Nada más. Cómo lo harías tu por ejemplo a grandes rasgos? Es que aun sigo sin saber cómo implementarlo.

La página de php.net ya la había visto, y con ello sé el funcionamiento básico de una cookie, y que si pongo false o 0, no hay expiración. Pero no habla de cómo usar la cookie en este caso de recordar autenticación.

Última edición por Tigervlc; 22/11/2005 a las 09:58
  #11 (permalink)  
Antiguo 22/11/2005, 10:53
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Te equivocas en ciertos aspectos, porque en mi error_log del servidor donde estoy alojado te aseguro que no aparece el aviso Notice si pongo @. Igual que evito el error en pantalla si lo tengo deshabilitado así en php.ini, evito el error en el log si pongo a off la visualización de errores en pantalla y habilito el archivo log de errores.
En mi caso siempre ví el "Notice" si activo el "log" de errores .. No sé que combinació usé .. Pero con el "dichoso" if() "preguntando" si existe o no la variable te evitas ese notice en cualquier caso. Por lo demás .. si usas la función error_reporting() (www.php.net/error_reporting) configurada a un nivel más bajo de reporte de errores te evitas por completo usar @ para no mostrar mensajes de error que igualmente personalizas tus mensajes aprovechando de que la mayoría de función de PHP ante un error devuelve un "false" (por eso lo usas bajo tus condicionales ..)

Cita:
Si no de qué serviría @? @ por lo que sé es una directiva para el manejo de errores y para que se puedan personalizar y visualizar de una forma más "elegante".
Justamente la @ está para usarlo en casos puntuales .. si lo vas a usar en TODO el script mejor usar error_reporting().

Cita:
Pero a ver, yo en el fondo lo que quisiera saber es cual es la forma usual de implementar esto de "recordar los datos de conexión del usuario", aunque no tenga nada que ver con cómo lo intento hacer yo. Nada más. Cómo lo harías tu por ejemplo a grandes rasgos? Es que aun sigo sin saber cómo implementarlo.
Por mi parte te expliqué como he visto que trabajan sistemas así (estos foros por ejemplo lo hacen así):

Cita:
La validación (el psudo-código o flujo) sería algo así:
1) Verificas la existencia de tus variables de sesión ... lo cual indicará una sesión activa o no.
1) Si no existe la sesión: Verificas tus valores (usuario/password) de tu cookie.
Si existe, usastes la opción "recordar" .. Tomas tus valores de tu cookie y en base a esos autentificas (contra tu BD o donde gestiones tus usuarios) y generas las variables de sesión como de costumbre. El sistema seguirá validando principalmente por tus variables de sesión y usará las sesiones para todo su proceso de tu aplicación.
3) No sé si usaras el mismo script para la autentificación desde tu formulario HTML de login .. pero si es así atacará esa validación al mismo proceso que haces si tomas los valores de tu cookie.
Cita:
La página de php.net ya la había visto, y con ello sé el funcionamiento básico de una cookie, y que si pongo false o 0, no hay expiración.
No, justamente con si no defines el parámetro de tiempo de expiración la cookie durará lo que tardes en salir de tu última página de tu sitio. Se denominan (si no me equivoco) cookie de "sesión" y cuando defines tiempo de expiración se denominan "persistentes". No hay cookie con tiempo de vida "infinito" sino que defines un tiempo de expiración de "años" simplemente si es que no quieres que aparentemente nunca muera dicha cookie.

http://www.allaboutcookies.org/cooki...-used-for.html


Cita:
Pero no habla de cómo usar la cookie en este caso de recordar autenticación.
Bueno .. el manual oficial de php.net es de "referencia" .. Es más probable que veas un comentario sobre alguna técnica concreta como la que quieres hacer en libros como los de "Luke Welling y Laura Thomson" o si visitas algunas web's de artículos sobre PHP como las que en las FAQ's tienes mencionadas:

http://www.forosdelweb.com/showthrea...936#post238936

Un saludo,
  #12 (permalink)  
Antiguo 22/11/2005, 11:04
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Algo ya hecho al respecto que encontré:

http://www.phpclasses.org/browse/package/1364.html

NO es exactamente para temas de "autentificación" (por qué parece que vuelca todos tus datos a una cookie para luego leerla de ahí y continuar con una sesión) pero .. la técnica es muyyyyyyyyy similar a lo que pretendes.

Un saludo,
  #13 (permalink)  
Antiguo 22/11/2005, 12:12
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 14 años, 6 meses
Puntos: 3
Ah, ok, gracias Cluster, me había hecho la picha un lío con el tema de la caducidad de las cookies. Pues entonces para empezar no me extraña que no las lea. Le pondré una caducidad larga. Creo que se usa time() + tiempo de caducidad, no? o es date()?

Por cierto, para el ejemplo ese tengo que estar registrado, y así lo he intentado hacer, pero levo ya esperando más de 1/4 de hora el email de confirmación. Sería mucho pedir, si es que estás registrado, que pusieras el código fuente aquí? Por lo que he visto son dos archivos, uno de clase y el ejemplo que usa la clase.
  #14 (permalink)  
Antiguo 22/11/2005, 12:41
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Ah, ok, gracias Cluster, me había hecho la picha un lío con el tema de la caducidad de las cookies. Pues entonces para empezar no me extraña que no las lea. Le pondré una caducidad larga. Creo que se usa time() + tiempo de caducidad, no? o es date()?
El tiempo se expresa en segundos y es un TIME STAMP .. por eso se usa time() + segundos (es decir, desde que creas la cookie (fecha/hora en timestamp actual + los segundos que quieras de caducidad).

Cita:
Por cierto, para el ejemplo ese tengo que estar registrado, y así lo he intentado hacer, pero levo ya esperando más de 1/4 de hora el email de confirmación. Sería mucho pedir, si es que estás registrado, que pusieras el código fuente aquí? Por lo que he visto son dos archivos, uno de clase y el ejemplo que usa la clase
No tengo a mano mi cuenta de registro de ese sitio, espera el e-mail de confirmación (lamentablemente acudí al sitio del autor y no deja bajarlo más que de phpclasses.org). Si encuentro otro sistema parecido en otro sitio te aviso.

Un saludo,
  #15 (permalink)  
Antiguo 22/11/2005, 13:51
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 14 años, 6 meses
Puntos: 3
He podido registrarme finalmente en esa web, y viendo el código, he deducido que los cambios a realizar en el código de arriba serían los siguientes, justo en los dos trozos donde creo la cookie y donde la leo:

Código PHP:
if ($_POST["recordar"]=='si') {
        
$cookieValue =  base64_encode(serialize($_POST["log_in"]."|".base64_encode(serialize($_POST["password"]);
        
setcookie('loginWebVN'$cookieValue time()+3600*24*365); 


Código PHP:
<td><input name="log_in" type="text" size="15" value=
"<?php if (!empty($_COOKIE["loginWebVN"])) 
             { 
                   
$partes explode('|',$_COOKIE["loginWebVN"]); 
                   echo 
base64_decode(unserialize($partes[0]));
             } 
?>"/> 
</td>
O sea, que en teoría lo único que debía cambiar era la forma de crear la cookie, usando base64_encode() y serialize() y separando cada dato almacenado (en este caso log_in y password) con un separador (esta vez he elegido '|' en lugar de ',' como en el ejemplo de esa web). Y para leerla, hacer justo lo contrario.

El problema ahora es que no me aparece el formulario. Debe haber un error.
  #16 (permalink)  
Antiguo 23/11/2005, 03:23
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 14 años, 6 meses
Puntos: 3
Alguien más puede ayudarme en esto de la opción "Recordar en este equipo" usando cookies en la autenticación?

Alguien sabe de algún ejemplo donde se explique bien?
  #17 (permalink)  
Antiguo 23/11/2005, 08:21
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Primero que nada ..

Has probado un ejemplo -básico- de uso de cookies? .. definir una variable en una cookie y leer su valor?

Empieza por lo facil. Yo todavía no sé para que almacenas "serializado" un par de datos (usuario/password) si descartas uno de ellos (el password) (o es que piensas usarlo? .. con que fin? .. como? ..)

Un saludo,
  #18 (permalink)  
Antiguo 23/11/2005, 15:15
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 14 años, 6 meses
Puntos: 3
Nooooo, no descarto el password, lo utilizo también, que te ha hecho pensar eso? Si en el código se veía claro, y no he repetido la operación de lectura del password porque era casi idéntica a la extracción del nombre de usuario. El password lo utilizo, o al menos intento recuperarlo del archivo de cookie y leerlo, y que su valor se visualice en el atributo value del campo de texto 'password' del formulario, al igual que hago con 'log_in' (o nombre de usuario).

Es que ya no sé qué más decir, pero esto se está haciendo muy redundante ya. No sé, yo creo que está ya bien claro lo que quiero conseguir, pero más que ayudarme, me estás diciendo lo que hago mal en vez de decirme qué he de hacer para hacerlo bien. No te lo tomes a mal, pero es así.

He leído y releído mis explicaciones, y estoy seguro de que está bien claro la funcionalidad que deseo conseguir.

A ver, entonces no tengo por qué serializar los datos de la cookie no? pero sí que debería encriptarlos al guardarlos y decriptarlos al leerlos ya que en el valor de la cookie almaceno el 'password' junto al nombre de usuario, es cierto? Pues por lo demás no sé qué es lo que hago mal para que no funcione, pues según creo hago el almacenamiento y la recuperación del valor de la cookie como se debería.
  #19 (permalink)  
Antiguo 23/11/2005, 18:32
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Sólo pretendo reducir el problema ..

Al parecer tenías problemas con la definición de valores en tu cookie: ya te hice mis comentarios y parece que se corrigieron. Ahora tienes problemas para leer esos datos de tu cookie. Como veo problemas en la gestión de cookies por A o B motivo te invito a realizar una sencilla prueba de manejo de cookies, cuando eso lo domines .. entonces nos liamos con algo más complejo como "serializar" datos o trabajar con array en cookies (vistes la documentación de www.php.net/setcookie al respecto? hay un ejemplo bien claro).

Cita:
He leído y releído mis explicaciones, y estoy seguro de que está bien claro la funcionalidad que deseo conseguir.
De todo el código al final y con la aclaración de "donde" ivas a usar el password -ahora- se vé que pretendes "pre-cargar" esos datos de usuario/password en tu formulario de login para que el usuario tan sólo le dé a "login" y se autentifique.

Bien, .. en esto y por eso te he hecho tannnnnntassss preguntas y te he pedido confirmación es en lo que discrepo sobre tu forma de resolver el problame.

Si tu lo haces así .. la contraseña que vas a tener que almacenar en tu cookie ha de ser "plana" (sin encriptación) .. la puedes "camuflar" como hace el ejemplo que vistes con base64_encode() .. serializando y demás .. Pero, en esos casos, la contraseña se guarda en MD5() o en el "hash" que uses (tu usas sha1()) para hacer el sistema "seguro".

Tampoco se precargan los valores en un formulario para que el usuario le dé al "login" sino que se revisa según el procedimiento que te indiqué unos mensajes más arriba sobre la existencia de esa la sesión->la cookie->datos del formulario .. y en función de eso autentificas .. por supuesto modificando la consulta SQL a tu BD de usuarios si tomas los datos de la cookie como te comento ahora: dejando el password en esa cookie encriptada con el "hash" que tu usas, en ese caso la consulta SQL no será:

AND password='".sha1($password)."'";

sino ..

AND password='".$_COOKIE['password'])."'";
(no exactamente así pero para "graficar" que me refiero al valor del dato que necesito: password de la cookie).

Me sigues?

Como te comento, en principio tienes un problema de uso de cookies (tanto simples como "avanzadas") .. Tu puedes crear perfectamente dos cookies una con el usuario y otra con el password .. dos cookies "simples" .. o puedes crear una cookie tipo array .. o incluso serializarlo (sea a tu manera o con serialize()).

En resumen .. antes de seguir avanzando y ya que tocas un tema que al parecer no has probado (las "cookies") es altamente recomendable que hagas ejemplos SIMPLES, los pruebes ... veas como funciona todo y luego intentes integrarlo en tu sistema (tal cual lo planteas tu o como te planteo yo ... Tu planteamiento es más simple de integrar a lo que ya tienes hecho pero tiene el detalle de seguridad que te he expuesto).

Un saludo,
  #20 (permalink)  
Antiguo 24/11/2005, 13:02
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 14 años, 6 meses
Puntos: 3
Ah, ya voy viendo más la luz! jejeje
Gracias por la información.

Entonces es más recomendable que al recuperar usuario y password a través de la cookie, no lo precargue en los campos del login sino que una vez leídos esos datos de la cookie haga directamente el acceso, sin que tenga que volver a visualizar los campos ni hacer ningún click el usuario, no?

Y por otra parte he entendido: guardar encriptando con una función hash el password en la cookie, que es lo que venía haciendo ya, y en el caso de la consulta SQL para cuando se recuperen dichos datos, cambiarla porque ya no habrá que usar sha1() como cuando se hace login, porque ya está realizada la encriptación, es así no?

Aparte de que voy a hacer alguna prueba más simple, empezando por el link que has puesto. Y para este ejercicio te haré caso y usaré una cookie para cada valor (usuario y password), o bien una cookie que almacene ambos en un array, me da igual.

Bueno Cluster, si tengo problemas ya diré algo, gracias por todo.

Bueno, ya puestos, de momento quiero hacer que funcione todo esto usando encriptación hash, con sha1() o md5(). Más adelante quiero implementar la opción de recuperación de contraseñas olvidadas. Evidentemente, usando una función hash, eso es imposible ya que son encriptadoras irreversibles. Cuál sería la mejor opción para el cifrado: MCRYPT_ENCRYPT y CRYPT_DECRYPT?

Un saludo!
  #21 (permalink)  
Antiguo 24/11/2005, 13:19
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Bueno, ya puestos, de momento quiero hacer que funcione todo esto usando encriptación hash, con sha1() o md5(). Más adelante quiero implementar la opción de recuperación de contraseñas olvidadas. Evidentemente, usando una función hash, eso es imposible ya que son encriptadoras irreversibles. Cuál sería la mejor opción para el cifrado: MCRYPT_ENCRYPT y CRYPT_DECRYPT?
mm La mayoría de sistemas lo que hacen es generarte una contraseña nueva.. se la comunicas a tu usuario (por e-mail, en pantalla .. etc) y a lo sumo al primer login con esa contraseña generada por el sistema le obligas/invitas a que la cambie por una de su agrado.

PD: .. por lo demás . .todo OK.

Un saludo,
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 11:24.