Foros del Web » Programando para Internet » PHP »

Registro usiaros con cookies - opinion

Estas en el tema de Registro usiaros con cookies - opinion en el foro de PHP en Foros del Web. Hola. Llevo un par de semanas aprendiendo PHP, y estoy metido de pleno con los sistemas de registro de usuarios. Ya me voy manejando con ...
  #1 (permalink)  
Antiguo 30/06/2008, 17:30
 
Fecha de Ingreso: febrero-2008
Mensajes: 93
Antigüedad: 16 años, 2 meses
Puntos: 4
Registro usiaros con cookies - opinion

Hola. Llevo un par de semanas aprendiendo PHP, y estoy metido de pleno con los sistemas de registro de usuarios. Ya me voy manejando con las cookies y he "desarrollado" mi primer sistema para loguearse.

El caso es que solo utilizo cookies (ya se que si el cliente las desactiva en su navegador casca) y queria pediros opinion a los que ya tengais experiencia en este campo, sobre la eficiencia del script, y consejos para mejorar el codigo.

Os dejo el codigo del index.php (solo la parte de programacion) y del login.php que es el encargado de procesar el formulario de login.

index.php

Código PHP:
<?php
                    
//Guardamos el formulario de login en una variable
                    
$formulario '<form id="login" action="login.php" method="post">'.
                            
'<strong>Nombre Usuario: </strong>'.
                            
'<input type="text" name="user" maxlength="15" />'.
                            
'&nbsp;&nbsp;&nbsp;'.
                            
'<strong>Contraseña: </strong>'.
                            
'<input type="password" name="pass" maxlength="25" />'.
                            
'&nbsp;&nbsp;'.
                            
'<input type="submit" value="Enviar"/>'.
                        
'</form>';
                    
//Si existen cookies, guardamos su contenido
                    
if ($_COOKIE['porraF1user'] && $_COOKIE['porraF1pass']){
                        
$user $_COOKIE['porraF1user'];
                        
$pass $_COOKIE['porraF1pass'];
                        
                        
$conexion mysqli_connect('localhost''usuario''contraseña''BDD');
                        
$consulta mysqli_query($conexion"SELECT Password FROM t_usuarios WHERE Nick='$user'");
                        
                        if (
$consulta){
                            
$resultado mysqli_fetch_assoc($consulta);
                            if (
$resultado['Password'] == $pass){
                                echo 
"Bienvenido <strong>$user</strong>";
                            }
                            else{
                                
//El usuario y la contraseña no se corresponden. Mandar mensaje de error y mostrar form de login
                                
echo '<pre class="error">Usuario y/o contraseña incorrectos</pre>';
                                echo 
$formulario;
                            }
                        }
                        else{
                            
//Error en la conexion
                            //La consulta fallo. Mostramos pantalla de error y mandamos al index despues de unos segundos
                            
echo '<pre class="error">Error en la conexion con la Base de Datos</pre>';
                        }
                }
                elseif(
$_COOKIE['porraF1error']){
                    echo 
'<pre class="error">Usuario y/o contraseña incorrectos</pre>';
                    echo 
$formulario;
                    
//Borramos la cookie de error para futuras cargas de la pagina
                    
setcookie('porraF1error''error'time()-3600);
                }
                else{
                        
//No existen las cookies, mostramos form de login
                        
echo $formulario;
                }
                
?>
login.php

Código PHP:
<?php
            
//Conectamos con la BDD
            
$conexion mysqli_connect('localhost''usuario''contraseña''BDD');
            
            if (!
$conexion){
                
//Error en la conexion
            
}
            else{
                
//Guardamos los valores del formulario
                
$user $_POST['user'];
                
$pass $_POST['pass'];
                
                
$consulta mysqli_query($conexion"SELECT Password FROM t_usuarios WHERE Nick='$user'");
                
//Guardamos los datos en la BDD
                
if ($consulta){
                    
$resultado mysqli_fetch_assoc($consulta);
                    
                    if (
$resultado['Password'] == $pass){
                        
//Creamos una cookie con 90 dias de duracion
                        
setcookie('porraF1user'$usertime()+7776000);
                        
setcookie('porraF1pass'$passtime()+7776000);
                        
//Y borramos la de error en caso de existir
                        
setcookie('porraF1error''error'time()-3600);
                    }
                    else{
                        
//El usuario y la contraseña no se corresponden. Destruimos las cookies
                        
setcookie('porraF1user'$usertime()-3600);
                        
setcookie('porraF1pass'$passtime()-3600);
                        
//Y creamos otra para mostrar mensaje de error
                        
setcookie('porraF1error''error'time()+180);
                    }
                    
//Mandamos al index
                    
header('location: index.php');
                }
                else{
                    
//Error en la consulta
                
}
            }
            
            
ob_end_flush();
        
?>
En ambos casos utilizo la funcion ob_start() para poder modificar los header en medio del script (en el caso del login.php), o para poder borrar la cookie de error (en el index.php, si no salta error).

Si teneis alguna duda de como funciona el codigo, no dudeis en preguntar.

Saludos y muchas gracias

P.D.: Me falta comprobar en el index.php si se produce error al conectar con la BDD.
  #2 (permalink)  
Antiguo 30/06/2008, 17:41
Avatar de jaronu  
Fecha de Ingreso: febrero-2008
Mensajes: 2.183
Antigüedad: 16 años, 1 mes
Puntos: 52
Respuesta: Registro usiaros con cookies - opinion

Hola

yo lo veo muy bien, pero lo que comentas , que lo basas solo en cookies y si el user las desactiva, no anda, creo que solo añadiendole sessiones para seguir a los usuarios logueados y aunque la cookies esten desactivadas, sigues al user con sesiones.

Un saludo
  #3 (permalink)  
Antiguo 30/06/2008, 18:40
Avatar de cplus  
Fecha de Ingreso: abril-2007
Mensajes: 164
Antigüedad: 17 años
Puntos: 1
Respuesta: Registro usiaros con cookies - opinion

ese sistema de seguridad es casi nulo... usa sessiones.
  #4 (permalink)  
Antiguo 01/07/2008, 00:09
 
Fecha de Ingreso: febrero-2008
Mensajes: 93
Antigüedad: 16 años, 2 meses
Puntos: 4
Respuesta: Registro usiaros con cookies - opinion

Me pondre pues a investigar a fondo el tema de las sesiones y adaptare el codigo. Muchas gracias por las opiniones, en unos dias, cuando tenga mis primeros vocetos vuelvo a colgar el codigo.

Saludos
  #5 (permalink)  
Antiguo 01/07/2008, 01:15
Avatar de Kamae  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona (Catalunya)
Mensajes: 307
Antigüedad: 16 años
Puntos: 13
Respuesta: Registro usiaros con cookies - opinion

Una cosa que he visto por ahí.. Eso de "if ($_COOKIE['porraF1user'] && $_COOKIE['porraF1pass']){" no te da un Warning cuando no hay ninguna cookie?


Yo usaría el isset() que es lo mismo pero de forma correcta ya que no da Warnings.

if (isset($_COOKIE['porraF1user']) && isset($_COOKIE['porraF1pass'])){

Saludos

PD: Yo también opino que deberías usar sessiones
  #6 (permalink)  
Antiguo 01/07/2008, 02:49
 
Fecha de Ingreso: febrero-2008
Mensajes: 93
Antigüedad: 16 años, 2 meses
Puntos: 4
Respuesta: Registro usiaros con cookies - opinion

Cita:
Iniciado por Kamae Ver Mensaje
Una cosa que he visto por ahí.. Eso de "if ($_COOKIE['porraF1user'] && $_COOKIE['porraF1pass']){" no te da un Warning cuando no hay ninguna cookie?


Yo usaría el isset() que es lo mismo pero de forma correcta ya que no da Warnings.

if (isset($_COOKIE['porraF1user']) && isset($_COOKIE['porraF1pass'])){

Saludos

PD: Yo también opino que deberías usar sessiones
Tomo nota. Muchas gracias ;)
  #7 (permalink)  
Antiguo 01/07/2008, 03:00
 
Fecha de Ingreso: junio-2008
Mensajes: 60
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Registro usiaros con cookies - opinion

¿Estás seguro de eso? yo siempre he utilizado las sesiones de php, pero hace poco he leido en unas diapositivas sobre la ingenieria de Flickr que las sesiones PHP las gestiona de forma poco eficiente, por lo que ellos pasaban de ellas y utilizaban cookies!

La verdad que se me hacer bastante raro porque siempre se ha dicho que dependen del navegador, que no son seguras...etc

Cita:
Iniciado por cplus Ver Mensaje
ese sistema de seguridad es casi nulo... usa sessiones.
  #8 (permalink)  
Antiguo 01/07/2008, 03:32
 
Fecha de Ingreso: febrero-2008
Mensajes: 93
Antigüedad: 16 años, 2 meses
Puntos: 4
Respuesta: Registro usiaros con cookies - opinion

Yo les veo un agujero de seguridad importante:

A ver si no digo una barbaridad pero... para poder compartir sesion entre paginas, en el caso de no tener cookies activadas, habria que propagar el SID por el URL no? no existe otra manera de hacerlo? haciendo pruebas, me doy cuenta que poniendo el session_start() en todas las paginas, inicia una sesion nueva en cada una.

Corregidme si me equivoco.

Saludos
  #9 (permalink)  
Antiguo 01/07/2008, 03:45
 
Fecha de Ingreso: junio-2008
Mensajes: 60
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Registro usiaros con cookies - opinion

La verdad que ahora mismo no estoy seguro de si usan cookies, pero lo que si estoy seguro es que ellos tenían su propio sistema de gestión de sesiones. La verdad que no se como se puede hacer sin utilizar las cookies, a vosotros se os ocurre alguna forma? Es que me tiene intrigado a mi el tema ese.....
  #10 (permalink)  
Antiguo 01/07/2008, 04:53
 
Fecha de Ingreso: febrero-2008
Mensajes: 93
Antigüedad: 16 años, 2 meses
Puntos: 4
Respuesta: Registro usiaros con cookies - opinion

Os dejo un chorizo considerable de codigo, que no funciona.

Las ramas del if que funcionan con las cookies activadas funcionan a la perfeccion, pero las que funcionan con la variable $_SESSION, no me pasa los valores de una pagina a otra.

index.php
Código PHP:
<?php
                    
echo "-".$_SESSION['user']."-".$_SESSION['pass']."-";
                    
//Guardamos el formulario de login en una variable
                    
$formulario '<form id="login" action="login.php" method="post">'.
                            
'<strong>Nombre Usuario: </strong>'.
                            
'<input type="text" name="user" maxlength="15" />'.
                            
'&nbsp;&nbsp;&nbsp;'.
                            
'<strong>Contraseña: </strong>'.
                            
'<input type="password" name="pass" maxlength="25" />'.
                            
'&nbsp;&nbsp;'.
                            
'<input type="submit" value="Enviar"/>'.
                        
'</form>';
                    
//Si existen cookies, guardamos su contenido
                    
if (isset($_COOKIE['porraF1user']) && isset($_COOKIE['porraF1pass'])){
                        
$user $_COOKIE['porraF1user'];
                        
$pass $_COOKIE['porraF1pass'];
                        
                        
$conexion mysqli_connect('localhost''user''pass''BDD');
                        
$consulta mysqli_query($conexion"SELECT Password FROM t_usuarios WHERE Nick='$user'");
                        
                        if (
$consulta){
                            
$resultado mysqli_fetch_assoc($consulta);
                            if (
$resultado['Password'] == $pass){
                                echo 
"Bienvenido <strong>$user</strong>";
                                
$_SESSION['user'] = $user;
                                
$_SESSION['pass'] = $pass;
                            }
                            else{
                                
//El usuario y la contraseña no se corresponden. Mandar mensaje de error y mostrar form de login
                                
echo '<pre class="error">Usuario y/o contraseña incorrectos</pre>';
                                echo 
$formulario;
                                
//Borramos las cookies incorrectas
                                
setcookie('porraF1user''error'time()-3600);
                                
setcookie('porraF1pass''error'time()-3600);
                            }
                        }
                        else{
                            
//Error en la conexion
                            //La consulta fallo. Mostramos pantalla de error y mandamos al index despues de unos segundos
                            
echo '<pre class="error">Error en la conexion con la Base de Datos</pre>';
                        }
                }
                elseif(isset(
$_SESSION['user']) && isset($_SESSION['pass'])){
                    
//Aqui va el caso de que la sesion este iniciada y no tengamos cookies
                    
$user $_SESSION['user'];
                    
$pass $_SESSION['pass'];
                    
                    
$conexion mysqli_connect('localhost''user''pass''BDD');
                    
$consulta mysqli_query($conexion"SELECT Password FROM t_usuarios WHERE Nick='$user'");
                    
                    if (
$consulta){
                        
$resultado mysqli_fetch_assoc($consulta);
                        if (
$resultado['Password'] == $pass){
                            echo 
"Bienvenido <strong>$user</strong>";
                        }
                        else{
                            
//El usuario y la contraseña no se corresponden. Mandar mensaje de error y mostrar form de login
                            
echo '<pre class="error">Usuario y/o contraseña incorrectos</pre>';
                            echo 
$formulario;
                            
//Borramos las cookies incorrectas
                            
setcookie('porraF1user''error'time()-3600);
                            
setcookie('porraF1pass''error'time()-3600);
                            
//Y borramos la de error para proximas cargas
                            
setcookie('porraF1error''error'time()-3600);
                        }
                    }
                }
                elseif(isset(
$_COOKIE['porraF1error'])){
                    echo 
'<pre class="error">Usuario y/o contraseña incorrectos</pre>';
                    echo 
$formulario;
                    
//Borramos la cookie de error para futuras cargas de la pagina
                    
setcookie('porraF1error''error'time()-3600);
                    
//Tambien borramos posibles cookies de usuari y pass
                    
setcookie('porraF1user''error'time()-3600);
                    
setcookie('porraF1pass''error'time()-3600);
                    
//Destruimos la sesion
                    
session_destroy();
                }
                elseif(isset(
$_SESSION['error'])){
                    
//El usuario y la contraseña no se corresponden. Mandar mensaje de error y mostrar form de login
                    
echo '<pre class="error">Usuario y/o contraseña incorrectos</pre>';
                    echo 
$formulario;
                    
//Borramos las cookies incorrectas
                    
setcookie('porraF1user''error'time()-3600);
                    
setcookie('porraF1pass''error'time()-3600);
                    
//Borramos la cookie de error para futuras cargas de la pagina
                    
setcookie('porraF1error''error'time()-3600);
                    
//Destruimos la sesion
                    
session_destroy();
                }
                else{
                        
//No existen las cookies ni sesion, mostramos form de login
                        
echo $formulario;
                }
                
?>

login.php

Código PHP:
<?php
            
//Conectamos con la BDD
            
$conexion mysqli_connect('localhost''user''pass''BDD');
            
            if (!
$conexion){
                
//Error en la conexion
            
}
            else{
                
//Guardamos los valores del formulario
                
$user $_POST['user'];
                
$pass $_POST['pass'];
                
                
$consulta mysqli_query($conexion"SELECT Password FROM t_usuarios WHERE Nick='$user'");
                
//Guardamos los datos en la BDD
                
if ($consulta){
                    
$resultado mysqli_fetch_assoc($consulta);
                    
                    if (
$resultado['Password'] == $pass){
                        
//Creamos una cookie con 90 dias de duracion
                        
setcookie('porraF1user'$usertime()+7776000);
                        
setcookie('porraF1pass'$passtime()+7776000);
                        
//Y borramos la de error en caso de existir
                        
setcookie('porraF1error''error'time()-3600);
                        
//Y además creamos variables de sesion por si el usuario tiene las cookies desactivadas
                        
$_SESSION['user'] = $user;
                        
$_SESSION['pass'] = $pass;
                    }
                    else{
                        
//El usuario y la contraseña no se corresponden. Destruimos las cookies
                        
setcookie('porraF1user'$usertime()-3600);
                        
setcookie('porraF1pass'$passtime()-3600);
                        
//Y creamos otra para mostrar mensaje de error
                        
setcookie('porraF1error''error'time()+180);
                        
//Creamos tambien una variable de error de sesion
                        
$_SESSION['error'] = 'error';
                    }
                    
//Mandamos al index
                    
header('location: index.php');
                }
                else{
                    
//Error en la consulta
                
}
            }
            
            
ob_end_flush();
        
?>
En ambos casos, en las primeras lineas, antes del doctype pongo esto:
Código PHP:
<?php
    
//Abrimos el buffer
    
ob_start();
    
//Iniciamos sesion
    
session_start();
?>
Cuando envio el formulario, llamo al login, que despues de crear las cookies y guradar las variables de sesion, vuelve al index, el cual segun si existen cookies (estan activadas) o no (no lo estan) trata de una manera y otra la sesion.

El problema es que los valores de sesion que asigno en login.php no los puedo recuperar en index.php, porque es otra sesion diferente. Con otras pruebas que hice con paginas sencillas no se me presentaba este error.

Alguna sugerencia?

Muchas gracias
  #11 (permalink)  
Antiguo 01/07/2008, 05:24
 
Fecha de Ingreso: febrero-2008
Mensajes: 93
Antigüedad: 16 años, 2 meses
Puntos: 4
Respuesta: Registro usiaros con cookies - opinion

He llegado a una conclusion. Borrando las lineas del login.php que crean las cookies de usuario y login, y activando las cookies del navegador, el script funciona a la perfeccion. Esto me hace pensar que el SID se transmite mediante una cookie de una página a otra.

El caso es que probe a transmitirla por URL y, o lo hice mal, o sigue sin funcionar.

Esto me esta comiendo la moral
  #12 (permalink)  
Antiguo 01/07/2008, 05:56
 
Fecha de Ingreso: febrero-2008
Mensajes: 93
Antigüedad: 16 años, 2 meses
Puntos: 4
Respuesta: Registro usiaros con cookies - opinion

Yo sigo con mi monologo, xD.

Consegui solucionar lo de propagar el SID mediante el url añadiendo estas lineas:

en el index.php

Código PHP:
    if (isset($_GET['s']) && strlen($_GET['s']) > 0){
        
session_id($_GET['s']);
    }
    
session_start(); 
Declarando de esa manera el inicio de sesion, evitamos que al poner el parametro vacio en el URL nos de error. Mi error era que asignaba el session_id() despues del session_start(), tonto de mi.

Y en el login.php

Código PHP:
header('location: index.php?s='.session_id()); 
Simplemente al cambiar la cabecera, añadimos el parametro.

Me queda modificar un par de lineas para que si tenemos las cookies activadas, no pase el SID por URL.

Se que es la eterna pregunta pero... no hay otra manera de propagar el SID sin mostrarlo en el URL y con las cookies desactivadas? No se si con ficheros de texto plano...

Un saludo
  #13 (permalink)  
Antiguo 01/07/2008, 06:02
 
Fecha de Ingreso: junio-2008
Mensajes: 60
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Registro usiaros con cookies - opinion

No se si ya te lo han dicho por ahi arriba, yo las formas que se son pasando el sid por url, o por POST mediate un formulario con un input type="hidden"

Cita:
Iniciado por alvaro_pasto Ver Mensaje
Yo sigo con mi monologo, xD.

Consegui solucionar lo de propagar el SID mediante el url añadiendo estas lineas:

en el index.php

Código PHP:
    if (isset($_GET['s']) && strlen($_GET['s']) > 0){
        
session_id($_GET['s']);
    }
    
session_start(); 
Declarando de esa manera el inicio de sesion, evitamos que al poner el parametro vacio en el URL nos de error. Mi error era que asignaba el session_id() despues del session_start(), tonto de mi.

Y en el login.php

Código PHP:
header('location: index.php?s='.session_id()); 
Simplemente al cambiar la cabecera, añadimos el parametro.

Me queda modificar un par de lineas para que si tenemos las cookies activadas, no pase el SID por URL.

Se que es la eterna pregunta pero... no hay otra manera de propagar el SID sin mostrarlo en el URL y con las cookies desactivadas? No se si con ficheros de texto plano...

Un saludo
  #14 (permalink)  
Antiguo 01/07/2008, 06:26
 
Fecha de Ingreso: febrero-2008
Mensajes: 93
Antigüedad: 16 años, 2 meses
Puntos: 4
Respuesta: Registro usiaros con cookies - opinion

Pues no me lo han comentado. Muchas gracias, me pongo a trabajar en eso y posteo resultados.

Saludos
  #15 (permalink)  
Antiguo 01/07/2008, 06:29
Avatar de vb2005  
Fecha de Ingreso: noviembre-2005
Ubicación: Paderborn - Alemania
Mensajes: 566
Antigüedad: 18 años, 5 meses
Puntos: 24
Respuesta: Registro usiaros con cookies - opinion

te corrijo, al poner session start en las páginas, se transfieren los datos, no por medio de cookies, es informacion guardada en el servidor, sinó fijate en otra página ponendole el session_start();

y luego haciendo print_r($_SESSION);

ahi vas a ver como los valores siguien ahi
__________________
www.marcher.com.uy - Web personal
Nerd's Corner - Desarrollo de software a medida
  #16 (permalink)  
Antiguo 01/07/2008, 06:41
 
Fecha de Ingreso: junio-2008
Mensajes: 60
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Registro usiaros con cookies - opinion

Claro! yo no se porque estás intentando manterner el sid mediante parametros get (no he leido el post ) pero si lo que queieres es mantener la sesion solo tienes que añadir un session_start() al comienzo de cada pagina!
  #17 (permalink)  
Antiguo 01/07/2008, 07:43
 
Fecha de Ingreso: febrero-2008
Mensajes: 93
Antigüedad: 16 años, 2 meses
Puntos: 4
Respuesta: Registro usiaros con cookies - opinion

Pues los valores no siguen ahi. Hago el print_r de la matriz, y nada, la matriz esta vacía, por eso me rompi tanto la cabeza para poder mantener el SID, porque a cada pagina que accedo, me abre una sesion diferente.
  #18 (permalink)  
Antiguo 01/07/2008, 14:42
Avatar de jaronu  
Fecha de Ingreso: febrero-2008
Mensajes: 2.183
Antigüedad: 16 años, 1 mes
Puntos: 52
Respuesta: Registro usiaros con cookies - opinion

Hola

Si las cookies estan desactivadas, tengo entendido que PHP transmite automaticamente el SID via GET, creo que te estas liando un poco, como te dijeron arriba usa

session_start ();

al comienzo de cada pagina.

Un saludo
  #19 (permalink)  
Antiguo 01/07/2008, 14:51
 
Fecha de Ingreso: febrero-2008
Mensajes: 93
Antigüedad: 16 años, 2 meses
Puntos: 4
Respuesta: Registro usiaros con cookies - opinion

Pero si ya lo estoy haciendo, xD.

Tengo la pagina index.php con su session start. Al enviar el formulario de login, llamo a la pagina login.php, que comprueba los datos, y mediante la funcion header(location: index.php); vuelvo al index. Cuando quiero recuperar lso datos que guarde en la variable $_SESSION ($_SESSION['user'] = $usuario por poner un ejemplo) en la pagina de login.php, simplemente no existe la matriz session, y el SID es diferente.

Quizas sea problema de configuracion del PHP (uso XAMPP), pero no se propaga automaticamente el SID por URL si no lo envio yo (si lo envio por URL no tengo ningun problema, pero estaba intentando llegar a una solucion alternativa en la qu el usuario no viese el chorizo de caracteres tan antiestetico y no seguro en el URL). Me seguire peleando con un formulario y un input hidden para que ese SID sea transparente para el usuario.

Saludos y gracias
  #20 (permalink)  
Antiguo 01/07/2008, 16:06
Avatar de jaronu  
Fecha de Ingreso: febrero-2008
Mensajes: 2.183
Antigüedad: 16 años, 1 mes
Puntos: 52
Respuesta: Registro usiaros con cookies - opinion

No se

para recuperar la variable de sesion pon solo esto

$_SESSION['user'] = $user;
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 18:25.