Ver Mensaje Individual
  #1 (permalink)  
Antiguo 23/08/2006, 01:15
Avatar de ArrauKano
ArrauKano
 
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 21 años, 5 meses
Puntos: 4
Seguridad en mis archivos "cache"

Hice un clase PowerCache con el objetivo de poder guardar en archivo cualquier dato que me parezca necesario dejar en "cache", por ejemplo el resultado de una consulta a una base de datos, o el resultado de editar una plantilla html pegandole su contenido.

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($fpserialize($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 unserializefile_get_contents($this->file) );
            return 
true;
        }
        return 
false;
    }
}
?>
Por el momento me resuelve el problema inicial de guardar cualquier dato ya que al instanciar cualquier objeto cache se le debe pasar al constructor el dato a ser "cacheado" por referencia, asi el valor del dato a guardar es el mismo que le del dato original al momento de querer guardarlo, incluso funciona con un tiempo de vigencia.

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.