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!
![Riendo](http://static.forosdelweb.com/fdwtheme/images/smilies/risa.png)
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;
}
?>
Espero haberme explicado, y que alguien vea el fallo! un saludo a todos y gracias de antemano