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);
?>
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