Ver Mensaje Individual
  #7 (permalink)  
Antiguo 09/05/2013, 02:12
jrBarcelo
 
Fecha de Ingreso: septiembre-2012
Ubicación: Palma de Mallorca
Mensajes: 25
Antigüedad: 11 años, 7 meses
Puntos: 1
Respuesta: Seguridad Sesiones PHP + MYSQL

Cita:
Iniciado por Triby Ver Mensaje
De momento, un error mío, mysql_num_rows() requiere un parámetro, en este caso, $result... pequeño detalle que se me (nos) pasó.

La función esUsuario() lo único que hace es verificar si el usuario actual tiene sesión iniciada o es un invitado.

Sugerencia, después de login redirige a una página donde sólo tengas:
Código PHP:
Ver original
  1. <?php
  2. var_dump($_SESSION, $_COOKIE);

Con eso vas a ver lo que hay en sesiones y en cookies, si todo va bien, entonces llamas a la función esUsuario() y vuelves a usar var_dump() para ver si hay cambios, si es el caso, entonces en esa función algo hay mal... como comentaba en ese tema, son ejemplos y no todos los probé, pero podemos hacerlo funcionar.


Buenos días! Me ha servido de ayuda esto que me comentaste, y creo que he encontrado el fallo en la función esUsuario(); Corrígeme si me equivoco,me explico...
Código PHP:
function esUsuario() {
    
    if( ! isset(
$_SESSION['usuario'])) {
        
//Aqui las operaciones si no existe la sesion
    
}
    
    if(isset(
$_SESSION['usuario'])) {
        
$cadena "{$_SESSION['usuario']['id']}|{$_SESSION['usuario']['nombre']}|{$_SESSION['usuario']['correo']}|{$_SERVER['REMOTE_ADDR']}";
        if(
strMd5($cadena) == $_SESSION['usuario']['comprobacion']) {
            
// Sesión válida, renovamos cookie para mantenerlo conectado
            
setcookie('usuario'"{$_SESSION['usuario']['id']}|{$_SESSION['usuario']['comprobacion']}"time() + (86400 30), '/');

            return 
true;
        }
        
// Sesión no válida, posiblemente es un ataque
        // Cerramos sesión
     
        
logout();//Si existe la sesion, y aunque la cadena y la sesion de comprobacion sean iguales, siempre haremos logout y por tanto la cookie estara en modo sin sesion,¿no?
    
}
    
// No hay sesión válida, nos aseguramos de que la cookie siga sin datos
    
setcookie('usuario''sin sesión'time() + 3600'/');//Aqui al final de la comprobación cambiaremos la cookie tambien, si o si, exista o no la sesion.
    
return false;

Al final de la función ,se ve que hacemos logout() y modificamos la cookie, pero estas operaciones no están sujetas a ninguna condición, por tanto siempre se realizaran cada vez que llamemos al script. ¿Voy bien?.

Por tanto modificando esta parte, y poniéndolo donde toca,que es si la cadena y la sesión no son iguales, funciona perfectamente y se mantiene la sesión.
Yo lo que haría, es poner un else donde esta la comparación de la cadena y la sesión comprobación, y poner que si no es igual, haga logout y cambie la cookie.
Quizás este diciendo una tontería.... no soy un experto.

Por otra parte, lo que no estoy seguro es si esta parte funciona bien. Que es el caso en que la session no exista.
Código PHP:
    if( ! isset($_SESSION['usuario'])) {
        
// Entonces buscamos en cookie
        
$cookie = (isset($_COOKIE['usuario'])) ? $_COOKIE['usuario'] : 'sin sesión';
        if(
$cookie != 'sin sesión' && $cookie != '') {
            
// Separamos ud y cadena de comprobación
            
$tmp explode('|'$cookie);
            
// Sólo será válida si son dos elementos
            
if(count($tmp) == 2) {
                
$id = (int) $tmp[0];
                
$result2 mysql_query("SELECT u_id, u_nombre,u_pass,u_email,u_nivel,u_creditos FROM user WHERE u_id='$id'");
                
$comp mysql_fetch_assoc($result2);

                
// Si los datos son válidos, creamos variables de sesión
                
$_SESSION['usuario'] = array(
                    
'id' => $comp['u_id'],
                    
'nombre' =>$comp['u_nombre'],
                    
'correo' => $comp['u_email'],
                    
'rol' => $comp['u_nivel'],
                    
'comprobacion' => $tmp[1// La cadena obtenida de cookie
                
);
                
            }
        }
    } 
Un saludo! y espero explicarme con claridad...a ver si conseguimos que funcione, ya que es un aporte muy interesante.