Protección archivos servidor

eXtreM3

Buenas, he desarrollado un sistema que permite subir archivos y ordenarlos por categorías. Pongamos que los archivos se suben a midominio.com/mis_subidas/ y pueden tener cualquier extensión.

Ahora mismo (lo cambiaré) le asigno la id del archivo al nombre físico correlativamente, de manera que la lista de archivos podría ser esta

1.jpg
2.pdf
3.zip
4.pdf

Tengo un par de dudas: para que un usuario pueda acceder a estos archivos tiene que estar logueado (se crea una $_SESSION) en el sistema.

Hay alguna manera de restringir los archivos únicamente a los usuarios que han iniciado sesión? Para que sólo se puedan descargar los archivos aquellos usuarios registrados que hayan iniciado sesión, y denegar el acceso si alguien rula el hotlink.

LOc0

Sí, con Apache+PHP está tirado.

1º Deniegas el acceso al directorio a través de httpd.conf

<Directory /var/www/loquesea/>
        deny from all
</Directory>

ó con un .htaccess que metas en el directorio a proteger:

        deny from all

2º Para descargar obligas que sea a través de un script tipo http://loquesea/descargar_fichero.php?id=num y compruebas que el usuario está logueado para después mandarle el fichero con http://php.net/manual/es/function.readfile.php (asegúrate de que PHP tiene permiso (chmod) para leer el fichero a descargar).

Salu2 ;)

1 2 respuestas
eXtreM3

#2 acabo de hacer lo de descargar el fichero a través de un download.php tal y como has puesto :P (sin haber leido tu respuesta xd).

Ahora una cosa más, ya que quiero entenderlo antes de hacerlo. Esa directriz que has puesto para el htaccess, poniéndolo dentro del directorio, si deniegas para todos cómo distingue los que entren desde mi script download.php y los que entren a pelo por hotlink?

1 respuesta
PiradoIV

#3 Porque PHP lee el fichero directamente a través del sistema operativo y el .htaccess nada más que es para la parte que sirve Apache, vamos, que van por caminos diferentes.

Ninja-edit: Por esto mismo, mucho ojo al hacer este tipo de implementaciones, ese download.php nada más que debe poder servir ficheros que tú le especifiques, nunca le dejes carta blanca al navegante a poderse descargar el fichero que quiera cambiando parte de la URL.

1 1 respuesta
eXtreM3

Vale, ha funcionado a la perfección. Si accedo a la url del archivo sin tener la session me deniega el acceso :P

No sabía que se podían meter htaccess a directorios que no fueran el raíz!

Gracias a #2 por el código y a #4 por la explicación ;)

edit: quoteo bien a Pirado y de paso decir que para este ejemplo en particular no me hace falta comprobar apenas nada, ya que todos los usuarios logueados tienen acceso a todos los archivos, pero también lo había contemplado :P

1 respuesta
elkaoD

Y si es necesario que la URL quede bonita como si no hubiera script por medio siempre puedes hacer un rewrite en htacccess.

PiradoIV

#5 No, a lo que me refiero es a que un usuario logueado puede pedirle a tu download.php el fichero password-de-la-basededatos.php, que se lo va a descargar íntegro, o ficheros de contraseñas del sistema operativo, etc.

Se me pueden ocurrir todo tipo de maldades.

2 respuestas
Soltrac

#7 Y todavía hay bugs de ese tipo en CMS y scripts actuales, solo hay q pasarse por páginas de exploits xDDDD

1 respuesta
eXtreM3

#7 Vale, entiendo que si el script lo dejas default pues es una bomba contra tí mismo, pero a nada que lo retoques y refuerces... no tiene porqué pasar nada no? Se me ocurren varias formas, cada una mejor que la anterior :P, y gracias de nuevo, no había pensado en eso.

Ya que estamos, para abordar un poco más el tema, si llegara el punto en el que tengo que desarrollar un sistema super seguro, tanto de datos lógicos como físicos, para la parte física que más recomendais?

2 respuestas
PiradoIV

#8 y frameworks enteritos :-/ xDDDD

#9 ahí ya me pillas, ¿te refieres a seguridad Linux en general?, eso ya es un tema mucho más amplio

elkaoD

#9 super-seguro parte física? ¿Quieres decir que no te roben el servidor físcamente? ¿Que los datos no se corrompan en el soporte físico?

1 respuesta
eXtreM3

Bueno pongamos con que no vamos a desarrollar la web de un banco nacional. Algún sistema seguro de carácter general.

#11 no hombre, no me refiero a que lleguen con un tanque y te revienten el edificio xD, me refiero al hackeo de un servidor completo y/o robo de los archivos.

Lo que preguntaba en #9 es "algo" que pueda hacer yo (nosotros) como desarrollador (es) con respecto a seguridad avanzada del servidor. Sé que es una pregunta bastante abierta, pero con que alguien de ideas de cosas que conoce / ha realizado serías suficiente :P

Buenos días xD

elkaoD

Pues desde mi nula experiencia en el tema, replicación, ya sea con algún tipo de RAID o incluso mejor replicación a otros servidores (no sea que te caiga un rayo en el datacenter como a Amazon.) Además te puedes montar un sistema de alta disponibilidad para que si se cae el servidor principal haga fallback a los servidores standby. Obviamente todo esto con comunicación segura: no es inteligente replicar BD por canales en texto plano.

Luego en cuanto a seguridad, lo más importante: cuantas menos personas tengan acceso a "lo gordo" mejor. El eslabón más débil en la seguridad SIEMPRE es el ser humano.

A partir de ahí mientras que programes con cabeza es MUY raro que alguien entre en un servidor (¿cuantos 0days hay ahora en servidores en producción?) Aún así por lo que tengo entendido ahora el tema en internet (por precio y por quitarte quebraderos de cabeza) es contratar servicios rollo Amazon AWS.

Usuarios habituales

  • elkaoD
  • eXtreM3
  • PiradoIV
  • Soltrac
  • LOc0