Bueno, después de un largo rato probando y probando con las cookies, ya parece que he encontrado una solución que funciona y parece tener sentido. Ruego me digáis si hay alguna incoherencia.
Por ejemplo, me gustaría saber si es necesario que el nombre de la cookie sea igual al nombre de la sesión. O también
¿Hay que hacer la llamada a session_name(...) y session_start() en todos los momentos que yo la hago, o sobra alguna llamada? El código para autentificar usuarios es el siguiente (pongo el código completo)
Archivo donde se comprueba el usr/pwd introducidos en el formulario:
accesoControl.php Código PHP:
<?
include("includes/conexionBBDD.php");
//Sentencia SQL para buscar un usuario con esos datos
$pwd = $_POST["pwd"];
$pwd = md5($pwd);
$userid = $_POST["userid"];
$ssql = "SELECT * FROM admin WHERE nombre='$userid' and pwd='$pwd' ";
//Ejecuto la sentencia
$rs = mysql_query($ssql);
//vemos si el usuario y contraseña es váildo
//si la ejecución de la sentencia SQL nos da algún resultado
//es que si que existe esa conbinación usuario/contraseña
if ($row = mysql_fetch_array($rs)){
//usuario y contraseña válidos
//defino una sesion y guardo datos
session_name("misitio");
session_start();
//sesión con cookies
$nombreCookie = 'miCookie';
//creamos un número aleatorio entre 0 y el nº de segs del momento actual, y le aplicamos md5
$valorCookie = md5(rand(0,time()));
//asignamos una validez a la cookie de 1 hora
$tActual = time(); //marca de tiempo en segundos
$tActualMasUnaHora = $tActual + 3600 ; //sumamos 1 hora (3600s)
$validezCookie = $tActualMasUnaHora;
//creamos la cookie
setcookie($nombreCookie,$valorCookie,$validezCookie);
//asignamos un identificador de sesión
$_SESSION["sessionID"]=$valorCookie;
///////
//damos acceso al sitio restringido
$url="Location: sitioRestringido.php";
header ($url);
}else {
//si no existe le mando otra vez a la portada
header("Location: acceso.php?err=usr");
exit();
}
mysql_free_result($rs);
mysql_close($conn);
?>
Archivo que hay que incluir al principio de cada .php que queramos restringir
seguridad.php Código PHP:
<?
//Inicio la sesión
session_name('misitio');
session_start();
$valorCookie = $_COOKIE["miCookie"];
if(!($_SESSION["sessionID"] == $valorCookie) ||
!(isset($_SESSION["sessionID"]))){
session_unset();
//destruimos la variable de sesión
$_SESSION= array();
//destruimos la posible cookie
setcookie('miCookie','',time()-3600);
session_destroy();
//volvemos a la pagina donde se pide usr/pwd
header("Location: acceso.php");
exit();
}
?>
Archivo para salir de la zona restringida y cerrar la sesión
salir.php Código PHP:
<?
session_name('misitio');
session_start();
//destruimos la sesión
session_unset();
//limpiamos el array de $_SESSION de posibles valores residuales
$_SESSION = array();
//destruimos la posible cookie
setcookie('miCookie','',time()-3600);
session_destroy();
header ("Location: index.php");
?>