Foros del Web » Programando para Internet » PHP »

Seguridad en mis archivos "cache"

Estas en el tema de Seguridad en mis archivos "cache" en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 23/08/2006, 01:15
Avatar de 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.
  #2 (permalink)  
Antiguo 23/08/2006, 06:29
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Para solventar tus problemas de seguridad de tus archivoso de caché:

1) No los coloques bajo el "Document Root" de tu servidor HTTP, así no quedarán accesibles por un llamanda por el URL desde un navegador cualquiera.
2) Protege el directorio (en caso de que no puedas o no quieras subir tus archivos arriba del "Document Rooot") vía .httaccess para que no sean accedidos por cualquier cliente sólo por llamadas locales (que es lo que PHP hará en el fondo). Esto es .. un "allow localhost" y "deny all" (o algo así).
3) Establece permisos de escritura y lectura a tus archivos de caché al usuario que los crea (no dés permisos tipo "0777" .. a todo el mundo y hasta de "ejecución") ...

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 23/08/2006 a las 06:39
  #3 (permalink)  
Antiguo 23/08/2006, 06:35
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
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.
Si eso te sucede .. cambiate de inmediato de proveedor. Para eso PHP implementa sistemas: open_base_dir .. "safe mode" (donde se revisa el UID y el GID del archivo para que sólo lo acceda quien lo creó) y otro tipo de configuración para que tus "vecinos" de un servicio de hosting compartido no te puedan hacer un "include()" si te indican la ruta absoluta completa de tus archivos (sean .php o lo que sean .... siempre que conozcan la ruta y nombre del archivo a incluir .. además que si pueden hacer esto .. implementando las funciones "dir" de PHP (www.php.net/dir) podrías "navegador" con total libertad por ese servidor abriendo archivos en modo lectura mínimo).

Cita:
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 ).
¿O_o'? Te imaginas el rendimiento de tu sistema? .. si ya generar tu caché y leerlo así como está ya baja el rendimiento de tu aplicación vs a lo que te ahorras en realizar esa consulta a tu BBDD y/o como lo uses .. Piensa en otro proceso más por médio para la encriptación/desencriptación de tus datos ... o más conexiones a BBDD para almacenar y extraer ese contenido si lo llevas a una BBDD.


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 23/08/2006, 10:15
Avatar de ArrauKano  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 21 años, 5 meses
Puntos: 4
Cita:
Iniciado por Cluster Ver Mensaje
1) No los coloques bajo el "Document Root" de tu servidor HTTP, así no quedarán accesibles por un llamanda por el URL desde un navegador cualquiera.
Toda la razón, recorde que algunos hostings proveen una carpeta /home/usuario y dentro una public_html, asi que si mi app guarda los archivos en ../ (pensando que esta en public_html) no serán accesibles por la url.
Aunq no me guata la idea que mi app dependa del hosting, de hecho programo pensando en que no siempre el hosting es el ideal, aunque podría dejar algunos detalles como "opcionales" si es que le bajan el rendimiento.

Cita:
Iniciado por Cluster Ver Mensaje
2) Protege el directorio (en caso de que no puedas o no quieras subir tus archivos arriba del "Document Rooot") vía .httaccess para que no sean accedidos por cualquier cliente sólo por llamadas locales (que es lo que PHP hará en el fondo). Esto es .. un "allow localhost" y "deny all" (o algo así).
Solo funciona en hostings linux donde este habilitado el uso de .htacccess (en cualquier caso, no pienso usar uno que no sea así), y volviendo al tema del hosting "no ideal", me quedo con las 2 soluciones anteriores, guardar fuera dle arbol o guardar los cache en una variable de cadena en un archivo .php para que al ser procesado no muestre nada.

Cita:
Iniciado por Cluster Ver Mensaje
3) Establece permisos de escritura y lectura a tus archivos de caché al usuario que los crea (no dés permisos tipo "0777" .. a todo el mundo y hasta de "ejecución") ...
He aquí una sorpresa que no me esperaba. Por lo que tengo entendido el usuario/grupo que ejecuta un script .php en un hosting en el mismo usuario/grupo que ejecuta el servidor web, y si esta compartido, por muy restrictivos que sean los permisos que le ponga, los otros clientes del hosting usan el mismo usuarios/grupo que el servidor web, o sea, mis archivos al lado de ellos son debieran ser igualmente visibles. Si es posible hacer que apache (u otro servidor) se ejecute como tal usuario de una carpeta hacia adentro (creo que con iis se puede), me gustaría saber como.

Todo este problema me surgió tambien de el hecho que en ciertas ocaciones o bien por ser gratuito un hosting o de pago no tengan toda la seguridad que se pudiera, y tambien pensando en que no siempre este andando bien la base de datos, para que funcione el sitio mientras se le hace mantenimiento, y para proteger los datos de conexion a la base.
  #5 (permalink)  
Antiguo 23/08/2006, 12:04
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
He aquí una sorpresa que no me esperaba. Por lo que tengo entendido el usuario/grupo que ejecuta un script .php en un hosting en el mismo usuario/grupo que ejecuta el servidor web, y si esta compartido, por muy restrictivos que sean los permisos que le ponga, los otros clientes del hosting usan el mismo usuarios/grupo que el servidor web, o sea, mis archivos al lado de ellos son debieran ser igualmente visibles. Si es posible hacer que apache (u otro servidor) se ejecute como tal usuario de una carpeta hacia adentro (creo que con iis se puede), me gustaría saber como.
Para eso PHP se puede configurar como "Safe mode":
http://www.php.net/features.safe-mode

Este modo de trabajo suele dar problemas a usuarios de PHP que no tienen muy claro los conceptos del "propietario" del archivo .. en consecuencia muchos proveedores de servicios de hosting se ven "presionados" a no usar "safe mode" a pesar de los problemas de seguridad que puede conllevar esto. (Hacen el comentario hasta en PHP.net en el primer párrafo de introducción al "safe mode").

Los problemas que describes son por qué PHP se instaló principalmente como "módulo del servidor HTTP" ... es decir, PHP queda compartido para todo usuario que use el servidor HTTP bajo el usuario que corre este último. Eso mejora el rendimiento de PHP pues queda el interprete PHP "residente" en memoria del servidor a la espera de una petición de un script PHP que interpretar, esto consume algo más de memoría del servidor constante pero no pierde tiempo en "levantar" PHP (el interprete) y "bajarlo" cuando termina la ejecución de tu script PHP (como sucede en modo CGI).

Otro tipo de instalación de PHP es como "CGI" (así se suele instalar en otros servidores HTTP no-Apache .. por ejemplo en IIS). En ese caso cada script PHP "levanta" al interprete cuando se pide un .php que ejecutar a tu servidor HTTP .. En este caso las configuraciones de PHP y el usuario que ejecuta tu script PHP es el que se define en forma individual para cada usuario (de un supuesto servidor "compartido").

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #6 (permalink)  
Antiguo 23/08/2006, 12:16
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Todo este problema me surgió tambien de el hecho que en ciertas ocaciones o bien por ser gratuito un hosting o de pago no tengan toda la seguridad que se pudiera, y tambien pensando en que no siempre este andando bien la base de datos, para que funcione el sitio mientras se le hace mantenimiento, y para proteger los datos de conexion a la base.
Te entiendo .. yo también he usado servicio de hosting gratuitos donde por ejemplo no me dán opción a colocar archivos por encima del "document root" que me asignan ..

Pero, a veces hay que plantearse ciertas cosas: realizar una aplicación que el rendimiento de la misma se va a ver mermado lo más seguro por un proceso "extra" a lo que realmente se trata tu aplicación por un tema de "no disponer de recursos" (lease: servicio de hosting en condiciones) ..

Cita:
en un archivo .php para que al ser procesado no muestre nada.
Se me olvidó antes ... Sobre esa solución . .sí, lo primero .. tu script .php .. si se ejecuta no verá nada (al llamarlo por el URL directo). Puedes añadir PHP para hacer algo tipo:

Código PHP:
<?php die("Aquí no hay nada que ver"); ?>
tus datos ...
Pero esto te obligará a procesar tu archivo al leerlo para quitar esa primera línea de tus archivos de "caché". (otro proceso más anexo a tu real propósito de tu aplicación).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:13.