Antes que nada me gustaría presentarme y saludar a la comunidad ya que es mi primer post. Me gustaría comentaros una situación que se me plantea y que arrojarais un poco de luz a una serie de cuestiones.Vamos el caso era la
creación de un sistema de sesiones para el logeo de usuarios y sus correspondientes acciones en función de sus privilegios y bla bla bla.Los problemas vienen a la hora de hacer este sistema de una forma un poco mas segura, el hosting donde puedo alojar el proyecto que estoy haciendo es un hosting compartido y decidi llevar el tema de las sesiones a una DB propia para que la informacion de las sesiones no estuvieran en el archivo temporal del hosting y las pudiera ver el que quisiera y supiera algo de lo que hay ahi.
Aqui un pequeño ejemplo de manejador (Esto es para local simplemente para montarlo )
Código PHP:
<?php
interface ISessionHandler {
public function OpenSession($SavePath, $SessionName);
public function CloseSession();
public function ReadFromSession($SessId);
public function WriteToSession($SessId, $SessionData);
public function DestroySession($SessId);
public function CollectGarbage($MaxLifeTime);
};
class SecureSessionHandler implements ISessionHandler {
private $save_path = NULL;
private $conn = NULL;
public function OpenSession($SavePath, $SessionName) {
try {
$this->conn = new PDO('mysql:host=localhost;dbname=securedb','root','');
return TRUE;
} catch ( Exception $error ) {
return FALSE;
}
}
public function CloseSession() {
$this->conn = NULL;
}
public function ReadFromSession($SessId) {
$query = "SELECT session_data FROM secure_sessions WHERE session_id = :sessid";
$st = $this->conn->prepare($query);
$st->setFetchMode(PDO::FETCH_OBJ);
$res = $st->execute(array(':sessid' => (string)$SessId));
if ( $res ) {
$row = $st->fetch();
if ( $row ) {
return $row->session_data;
}
}
return '';
}
public function WriteToSession($SessId, $SessionData) {
$query = "SELECT session_id FROM secure_sessions WHERE session_id = :sessid";
$st = $this->conn->prepare($query);
$res = $st->execute(array(':sessid' => (string)$SessId));
$row = $st->fetch();
if ( $row ) {
$query = "UPDATE secure_sessions SET session_data = :sessdata , session_lastaccesstime = NOW() WHERE session_id = :sessid";
$exst = $this->conn->prepare($query);
} else {
$query = "INSERT INTO secure_sessions (session_id, session_data, session_lastaccesstime) VALUES(:sessid, :sessdata,NOW())";
$exst = $this->conn->prepare($query);
}
return $exst->execute(array(':sessid' => (string)$SessId, ':sessdata' => (string)$SessionData));
}
public function DestroySession($SessId) {
$query = "DELETE FROM secure_sessions WHERE session_id = :sessid";
$st = $this->conn->prepare($query);
$res = $st->execute(array(':sessid' => (string)$SessId));
return $res;
}
public function CollectGarbage($MaxLifeTime) {
$query = "DELETE FROM secure_sessions WHERE session_lastaccesstime < DATE_SUB(NOW(), INTERVAL " . $MaxLifeTime . " SECOND)";
$st = $this->conn->prepare($query);
$res = $st->execute();
return $res;
}
}
$session_handler = new SecureSessionHandler();
$open_handler = array($session_handler, 'OpenSession');
$close_handler = array($session_handler, 'CloseSession');
$read_handler = array($session_handler, 'ReadFromSession');
$write_handler = array($session_handler, 'WriteToSession');
$destroy_handler = array($session_handler, 'DestroySession');
$gc_handler = array($session_handler, 'CollectGarbage');
session_set_save_handler($open_handler, $close_handler, $read_handler, $write_handler, $destroy_handler, $gc_handler);
?>
Todo funciona bien menos el recolector de basura que no me borra los datos de la DB si borro manualmente no hay ningún problema.Estaba realizando las pruebas cuando accede el usuario con estas premisas
ini_set("session.cookie_lifetime", 10);
ini_set("session.gc_maxlifetime", 10);
ini_set("session.gc_probability",100);
para que a los 10 segundos caducara la sesión y la probabilidad de que pasara el recolector fuera del 100%(mas que nada para ver que funciona todo el chiringuito)
Vamos por lo que tengo en mente de como funciona se supone que la Cookie del navegador caduca y php interpreta que a partir de los 10 segundos el contenido de esa sesión es no valido y por tanto llama al manejador para ejecutar el recolector de basura.Ideas?
PD:si es un fallo con la sintaxis PDO decidmelo please que solo lleva un un par de dias formando parte de mi vida.Gracias saludos