Código PHP:
<?php
Class PowerCache {
/**
* Referencia al dato cacheable
*/
var $data;
var $file;
var $time;
/**
* Constructor
*
* Una forma encapsulada de setCache
*/
function PowerCache(&$data, $file, $time=null)
{
$this->setCache($data, $file, $time);
}
/**
* Establece un cache para $data, apuntando al archivo $file
* y estará vigente durante $time segundos
*/
function setCache(&$data, $file, $time=null)
{
$this->data =& $data;
$this->setFile($file);
$this->setTime($time);
}
/**
* Establece el archivo de cache
*/
function setFile($file) {
$this->file = (!is_string($file)) ? 'cache.data' : $file;
}
/**
* Establece el tiempo de vigencia del cache
*/
function setTime($time) {
$this->time = (!is_numeric($time) OR $time < 0) ? 300 : $time;
}
function getTime() {
if( file_exists($this->file) )
return time() - filemtime($this->file);
else
return -1;
}
/**
* Retorna una referencia al dato en cache
*/
function &getData() {
return $this->data;
}
function save()
{
$state=true;
if (!$fp = fopen($this->file, 'w')) {
//echo 'No se puede abrir el archivo ('.$this->file.')';
$state = false;
}
if (fwrite($fp, serialize($this->data)) === FALSE) {
//echo 'No se puede escribir al archivo ('.$this->file.')';
$state = false;
}
fclose($fp);
return $state;
}
/**
* Carga los datos desde Cache, sólo si existe el archivo y está vigente.
*/
function load()
{
if(file_exists($this->file)
AND is_readable($this->file)
AND $this->getTime() <= $this->time
)
{
$this->data = unserialize( file_get_contents($this->file) );
return true;
}
return false;
}
}
?>
Mi problema es que asi como esta lo encuentro inseguro, ya que si alguien conoce mi script (pienso publicarlo) sabra donde guardo los archivos cache, por lo tanto:
(1) un dato serializado = es legible, no se encriptan.
(2) bastará con poner la url en le navegador y bajar
(3) si guardara el cache en un archivo .php y la cadena en una variable, probablemente desde afuera no se vería nada, pero si uso un hosting compartido podrían hacerle include() y ver que variables tiene.
el problema (2) pienso solucionarlo como explique en el (3), pero aun no estoy seguro de que hacer con el (1) y el (3).
Pensaba en hacer/adjuntar un pack de métodos de encriptación de doble vía. Adjuntar algun pequeño código en la cabecera del cache para evitar que sea incluído si no pertenece a mi sitio (no se me ocurre como validar eso, pero die() me podría ayudar en caso de false ). Otra cosa, pensaba guardar la conexión a la base de datos de esta forma, de alguna manera que el propio sitio solamente pudieara ver los datos para efectuar la conexion.
Este tema de la seguridad da para largo... espero ojala no haber dado lata con esto, espero que algunos entendidos aqui puedan hecharle un ojo a mi clase y ver que le modificar/complementar para hacerla + segura.