restringir el acceso a directorios en un servidor

Hola
veréis. Estoy intentando hacer una especie de disco duro virtual en php y sql, con usuarios y esas cosas. El problema que he encontrado es que no sé cómo restringir el acceso a los ficheros que los usuarios suben. Por ejemplo, tenemos al usuario GATO y gato tiene su cuenta. Los archivos que GATO sube se guardan en la carpeta GATO del servidor, pero no quiero que se pueda entrar directamente poniendo /GATO/nombredelarchivo. Sólo quiero que se pueda entrar por una página concreta que puede ser discoduro.php.

¿cómo lo hago? ¿se puede?
Supongo que se podrá... a mi la solución cutre salchichera que se me ocurre ahora mismo es que para empezar evidentemente no permitas listar los archivos de ese directorio, y luego que los archivos subidos se guarden con otro nombre distinto, manteniendo la relación entre el nuevo nombre y el nombre original en una tabla sql.

Ya avisé que era una idea cutre [+risas]
ya se me había ocurrido a mi, pero con eso no resuelves nada. por mucho que le cambies el nombre se podrá seguir bajando
Y moviendo los archivos subidos fuera del arbol del servidor web? Cuando el usuario quiera ver los archivos, los datos se sacan de la tabla de sql (vamos, que lo que ve no son los archivos en sí), y cuando quiera descargar alguno se crea un enlace simbólico al archivo dentro del árbol de la web (aunque esto sólo con php no se yo). Cuando finalice la sesión del usuario, fuera enlaces.

De todas formas el usuario no tiene por qué saber dónde están almacenados los archivos, aunque los tengas colgando de la web. Administrando las descargas con php en vez de usar links directos la ruta al archivo no debería aparecer por ninguna parte ¬_¬
3 respuestas