Escribir archivos en una subcarpeta de la carpeta web (seguridad de apache)

2

Necesito guardar los datos de la sesión para un script de página web dinámico escribiendo en el archivo. Tengo dos preguntas:

  1. ¿Hay alguna preferencia de seguridad en cuanto a si guardar los datos BAJO la carpeta web, o FUERA de la carpeta web?

  2. Intenté escribir en la carpeta y (sin sobresalir), tuve un error de tipo de "permiso de archivo rechazado". ¿Debo establecer la propiedad de la carpeta para el usuario de apache (600, 640 o 644?)

Icono de la función de la Edición de la Tarjeta de Seguridad

core     <- 'OUTSIDE' web folder (php script live here)
data     <- 'OUTSIDE' web folder (session data and other misc data resides here)
web      <-  web root folder
   js    <-  any folder below is 'INSIDE' the web folder
   css
   html  

Por ejemplo, en un script php (es decir, una página dinámica de PHP), puedo intentar escribir en un archivo usando algo como fput('../data',data) todavía (como lo entiendo) ../data No debe ser accesible - por razones de seguridad.

¿Podría alguien proporcionar un ejemplo simple que muestre cómo proporcionar acceso a ../data/ en el ejemplo anterior?

¿Cuáles son los pasos ESPECÍFICOS reales requeridos?

Por cierto, estoy ejecutando en una pila LAMP.

    
pregunta Homunculus Reticulli 30.03.2012 - 02:33
fuente

2 respuestas

4

Absolutamente hay una preferencia de seguridad para guardar datos confidenciales fuera de su raíz web. Si no desea que usuarios aleatorios puedan acceder a los datos, no los coloque en la raíz web.

Claro, puede configurar los permisos de archivo para que no sean legibles o configurar Apache para que niegue el acceso al archivo o usar mod_rewrite para bloquear los intentos de acceso al archivo, pero estos mecanismos de seguridad son mucho más propensos a errores y más inconvenientes que simplemente Poniendo datos sensibles fuera de la raíz web. Y los datos de sesión definitivamente califican como datos confidenciales.

Y en qué establecer los permisos de carpeta depende de la configuración de su servidor. En una configuración LAMP estándar, PHP se ejecutará como el mismo usuario que Apache (a menudo nobody ). Sin embargo, en el alojamiento compartido, el script PHP a menudo se ejecuta bajo el propio usuario SFTP / shell del dominio. Pero de cualquier manera, no debería dar a otros usuarios acceso de lectura a los datos de su sesión.

    
respondido por el Lèse majesté 30.03.2012 - 07:08
fuente
2

Algunas reglas generalizadas sobre seguridad te ahorrarán mucho dolor. Sí, es técnicamente posible almacenar contenido actualizable dentro de webroot. Pero debe asegurarse de que los usuarios no puedan cambiar las cosas que no desea que cambien los usuarios, y que el almacenamiento de contenido no se pueda usar para alojar datos que no deberían estar allí, y que no existe una conexión directa. acceso al sitio web a través del servidor web, y que los datos almacenados no son en sí mismos código (PHP, javascript, ssi ...). La vida se vuelve mucho más simple cuando almacena datos enviados por el usuario en otro lugar. Además, hacer que todo el contenido de webroot sea solo para el servidor web ayuda.

  

He tenido un error de tipo 'permiso de archivo rechazado'. ¿Debo establecer la propiedad de la carpeta para el usuario de apache (600, 640 o 644?)

Esta es una pregunta mucho más general. Por lo general, defino un par de grupos (y hago un buen uso del indicador setgid en los directorios) uno que incluye administradores del sitio pero excluyendo el servidor web uid (webdev) y uno con los administradores del sitio y servidor web uid (webdata). Todos los archivos dentro de la raíz web son legibles por otros y solo se pueden escribir en webdev. El directorio de datos (archivos de sesión, algo de contenido dinámico) se puede escribir en el grupo de datos web. Pero este podría no ser el modelo adecuado para ti. Hacer directorios / archivos .rwxrwxrwx debería ser un último recurso.

Además, trate de no usar directorios relativos cuando haga referencia a diferentes partes de su sitio. Hace que el sitio se mueva como un todo, pero socava la capacidad de mover partes del sitio fácilmente. Si define una url base en su configuración, use este prefijo para las rutas que obtenga lo mejor de ambos mundos.

    
respondido por el symcbean 02.04.2012 - 16:22
fuente

Lea otras preguntas en las etiquetas