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

Buenas tardes a todos!

Estoy intentando aumentar la seguridad de mi web, encriptando las sesiones y haciendo comprobaciones en todas mis paginas.
Encontre un código en esta misma web muy util:

http://www.forosdelweb.com/f18/aporte-seguridad-basica-php-1011808/#post4265380

Se ve un ejemplo completo de login, comprobacion si es usuario o no y logout.

En principio funciona perfectamente, el problema es cuando lo adapto a mi codigo con Mysql.

Entoces peta todo!

Código PHP:
<?php
require 'db.php';

// Un pequeño agregado para usar en md5()
DEFINE('SALT_MD5''AbC%"$%"');

// Obtener cadena de comprobación
function strMd5($cadena) {
    return 
md5(SALT_MD5 $cadena SALT_MD5);
}
// Ingreso de usuario
function login($userMail,$userPass) {
    
session_regenerate_id(true);

    
$sqlLogin mysql_fetch_assoc(mysql_query("SELECT u_id, u_nombre,u_pass,u_email,u_nivel,u_creditos FROM user WHERE u_email='$userMail' and u_pass = '$userPass'"));

    
$_SESSION = array(
        
'usuario' => array(
            
'id' => $sqlLogin['u_id'],
            
'nombre' => $sqlLogin['u_nombre'],
            
'correo' => $sqlLogin['u_email'],
            
'rol' => $rol,
            
'comprobacion' => strMd5("{$_SESSION['usuario']['id']}|{$_SESSION['usuario']['nombre']}|{$_SESSION['usuario']['correo']}|{$_SERVER['REMOTE_ADDR']}")
        )
    );
    
// Creamos cookie 'usuario' con id y cadena de comprobación
    // Expira en un mes y está disponible en la raiz del sitio y todas las subcarpetas
    
setcookie('usuario'"{$_SESSION['usuario']['id']}|{$_SESSION['usuario']['comprobacion']}"time() + (86400 30), '/');
    
print_r($_SESSION['usuario']);
    
// Redirigimos a página de usuario
    
header('Location: otro.php');
    exit;
}
// Finalizar sesión
function logout() {
    
// Creamos una nueva id de sesión y eliminamos la anterior (true)
    
session_regenerate_id(true);
echo 
'sañor';
    
// Eliminamos información de sesión
    
$_SESSION = array();

    
// Borramos info de cookie
    
setcookie('usuario''sin sesión'time() + 3600'/');

    
// Redirigimos a página principal
    
header('Location: index2.php');
    exit;
}
// Comprobar si es una sesión válida
// Devuelve verdadero sólo si el usuario inició sesión y la cadena de comprobación es correcta
// Si el usuario cambia de IP, entonces finalizará su sesión
function esUsuario() {
    
// Si no existe la variable de sesión
    
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];
                
$comp mysql_fetch_assoc(mysql_query("SELECT u_id, u_nombre,u_pass,u_email,u_nivel,u_creditos FROM user WHERE u_id='$id'"));
//                $sql = "SELECT id, nombre, correo, rol FROM usuarios WHERE id = $id";
                // Leemos la consulta con nuestra librería preferida

                // 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' => "jodido",
                    
'comprobacion' => $tmp[1// La cadena obtenida de cookie
                
);
            }
        }
    }
    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
        
echo 'Sesion no valida';
        echo 
'<br/>';
        
print_r($_SESSION['usuario']);
         echo 
'<br/>';
        
print_r(strMd5($cadena));
        
logout();
    }
    
// No hay sesión válida, nos aseguramos de que la cookie siga sin datos
    
setcookie('usuario''sin sesión'time() + 3600'/');
    return 
false;
}
?>
Esto es lo que tengo hasta ahora... el problema, creo, esta cuando comprueba las dos cadenas encriptadas, ya que nunca dan igual!

Espero haberme explicado, y que alguien vea el fallo! un saludo a todos y gracias de antemano