Ver Mensaje Individual
  #6 (permalink)  
Antiguo 16/07/2010, 06:08
Javi_Portillo
 
Fecha de Ingreso: julio-2010
Mensajes: 7
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Cookies incomibles (no se destruyen)

Muchas gracias a los dos.

abimaelrc, no utilizo las sesiones más que nada porque ya las tengo "ocupadas" para otro tipo de funciones, y no me gusta ir mezclando, que así luego me pasa, que tengo un lío entre $_SESSION, $_SERVER, $_COOKIE, $_POST, $_GET,... pero bueno, en realidad me queda más claro, además de que me mola el efecto que da que te salga el pop up del navegador al hacer la validación mediante el servidor (si me decís cómo conseguir ese resultado con otros medios, soy todo oídos).

santhy, en primer lugar, la contraseña evidentemente encriptada y el login viajan en cookies cuyo nombre está también encriptado, gracias por el apunte ;)

Finalmente no te he hecho caso con el tema de usar un ID de sesión, ya que el navegador que usaba efectivamente sólo la cambiaba cuando lo cerraba, así que me he sacado de la manga una cookie con valores 0 o 1 que me dice si no he hecho logout o sí y, a partir de eso, mi función de login ya dilucida qué hacer.

Probablemente sea poco ortodoxo, pero funciona de la manera que yo quiero (con las pruebas que he hecho, que lo mismo mañana lo usa otro y peta), así que me vale.

Bueno, finalmente, aquí os dejo con el código:

Función de login
Código PHP:
function login() {
    
$loginkey md5('login');
    
$passwordkey md5('password');
    
    if (
$_COOKIE['session'] == && isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) {
        
mysql_connect('a ti te lo voy a decir''venga, sí, hombre...''y qué más') or die('Unable to connect MySQL server!');
        
mysql_select_db('va a ser que no') or die('Unable to select requested database!');
        
mysql_query("SET NAMES 'utf8'");
        
$query mysql_query("SELECT * FROM `users` WHERE `login` = '".$_SERVER['PHP_AUTH_USER']."'");
        
        if (
$row mysql_fetch_row($query)) {
            if (
$row[5] == md5($_SERVER['PHP_AUTH_PW'])) {
                
setcookie($loginkey$row[4], time() + 7776000); // 90 días dura la cookie
                
setcookie($passwordkey$row[5], time() + 7776000);
                
setcookie('session'1time() + 7776000);
                return 
$row;
            }
            else {
                echo 
'Contraseña incorrecta';
                echo 
'<br />';
                echo 
'<button id="button" type="button" onclick="location.href=\'index.php\'">Volver al inicio</button>';
                exit();
            }
        }
        else {
            echo 
'Usuario no existente en la base de datos';
            echo 
'<br />';
            echo 
'<button id="button" type="button" onclick="location.href=\'index.php\'">Volver al inicio</button>';
            exit();
        }
    
        
mysql_free_result($query);
        
mysql_close();
    }
    else if (isset(
$_COOKIE['session']) && isset($_COOKIE[$loginkey]) && isset($_COOKIE[$passwordkey])) {
        
mysql_connect('a ti te lo voy a decir''venga, sí, hombre...''y qué más') or die('Unable to connect MySQL server!');
        
mysql_select_db('va a ser que no') or die('Unable to select requested database!');
        
mysql_query("SET NAMES 'utf8'");
        
$query mysql_query("SELECT * FROM `users` WHERE `login` = '".$_COOKIE[$loginkey]."' AND `password` = '".$_COOKIE[$passwordkey]."'");
        
        if (
$row mysql_fetch_row($query)) {
            
setcookie($loginkey$row[4], time() + 7776000); // 90 días dura la cookie
            
setcookie($passwordkey$row[5], time() + 7776000);
            
setcookie('session'1time() + 7776000);
            return 
$row;
        }
        else {
            
//Destruimos las cookies.
            
setcookie($loginkey'x'time() - 3600);
            
setcookie($passwordkey'x'time() - 3600);
            
setcookie('session'1time() - 3600);
        }
    
        
mysql_free_result($query);
        
mysql_close();
    }
    else {
        
header('WWW-Authenticate: Basic realm="Mobail Apps SL"');
        if (
strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome')) {
            if (
$_COOKIE['session'] == && $_COOKIE['chrome_control'] != 1) {
                
setcookie('session'1time() + 7776000);
                
setcookie('chrome_control'1time() + 7776000);
            }
            else {
                
setcookie('session'0time() + 7776000);
            } 
        }
        else if (
strpos($_SERVER['HTTP_USER_AGENT'], 'Safari')) {
            if (
$_COOKIE['session'] && $_COOKIE['safari_control'] != 1) {
                
setcookie('session'1time() + 7776000);
                
setcookie('safari_control'1time() + 7776000);
            }
            else {
                
setcookie('session'0time() + 7776000);
            }
        }
        else {
            
setcookie('session'0time() + 7776000);
        }
        
header('HTTP/1.1 401 Unauthorized');
        echo 
'Lo sentimos, pero no est&aacute; autorizado para ver esta p&aacute;gina';
        echo 
'<br />';
        echo 
'<button id="button" type="button" onclick="location.href=\'index.php\'">Volver al inicio</button>';
        exit();
    }

Función de logout
Código PHP:
$loginkey md5('login');
$passwordkey md5('password');

setcookie('session'1time() + 7776000);
if (isset(
$_COOKIE['chrome_control'])) {
    
setcookie('chrome_control'0time() - 3600);
}
if (isset(
$_COOKIE['safari_control'])) {
    
setcookie('safari_control'0time() - 3600);
}
setcookie($loginkey'x'time() - 3600);
setcookie($passwordkey'x'time() - 3600);

echo 
'Se ha deslogueado correctamente';
echo 
'<br />';
echo 
'<button id="button" type="button" onclick="location.href=\'index.php\'">Volver al inicio</button>';
exit(); 
Evidentemente, se admiten reclamaciones, quejas, insultos, improperios y demás. Un saludo.

PD Edit 1: si antes lo digo... los códigos que tenía antes colgados no funcionaban muy para allá. Finalmente lo he solucionado, aunque he tenido que verme forzado a meter parches para Safari y Chrome, pero si funciona...

Última edición por Javi_Portillo; 20/07/2010 a las 04:44 Razón: Corregir código