2012-05-10 43 views
8

lo que estoy haciendo:Cómo almacenar archivos de forma segura en el servidor

Básicamente necesito para crear un sitio web asegurado por una página de acceso escrito en PHP que una vez iniciada la sesión, que tiene una barra de búsqueda que lee los enteros y los datos se envían a un script PHP que recupera una imagen con el número como su nombre.

(Voy a almacenar unos pocos miles de imágenes en este servidor que se debe buscar - imágenes de inventario)

-

Lo que necesito ayudar con:

De mi investigación, entienda que "no" usa bases de datos como MySQL para almacenar imágenes reales debido a la velocidad y la ineficiencia. Si no lo almacena en una base de datos y lo deja en el sistema de archivos del servidor como se sugiere, si alguien escribe una URL directa en una barra de direcciones, ¿no los llevaría a los archivos de mi servidor?

¿Cómo se puede proteger contra esto. No quiero que se vean archivos en mi servidor sin pasar con éxito por la página de inicio de sesión.

Gracias por cualquier ayuda, cualquier idea o sugerencia sería apreciada. Esto es importante para mí porque se agregará información más compleja en el futuro.

+2

Puede tener un directorio al que no se puede acceder a través de HTTP y puede usar un script php que comprueba si el usuario ha iniciado sesión y, en caso afirmativo, lee el archivo del directorio especificado y lo genera. –

+0

He leído para dejar un archivo fuera de la carpeta "public_html". ¿Eso lo haría completamente inaccesible desde http? ¿Cómo mi script php tendría acceso a los archivos, entonces? – DMor

+0

'public_html' es generalmente el directorio desde el que se sirven los archivos, cuando se usa Apache con cPanel. Eso significa que cuando escribe 'http: // yoursite.com', los datos se extraen de'/var/www/username/public_html'. Eso también significa que cualquier cosa que escriba en la URL, '/ var/www/username' es ** no ** accesible. También significa que un directorio que usted crearía allí, como '/ var/www/username/files' tampoco sería accesible. Desde su script PHP, accederá a él con algo como 'file_get_contents ('/ var/www/username/files/imagename.extension');'. –

Respuesta

6

una forma o recomienda f El manejo de las descargas de archivos a través de PHP (o cualquier otro script) es mediante el uso del llamado encabezado de respuesta 'X-Sendfile'.

La secuencia de comandos PHP maneja la autenticación y una vez validada establecerá algunos encabezados de respuesta junto con un 'X-Sendfile' que le indica al servidor web que entregue un archivo; el script termina y el servidor web toma el control.

Vea aquí un ejemplo sencillo:

http://www.jasny.net/articles/how-i-php-x-sendfile/

+1

Voy a ver esto, gracias. – DMor

0

puede hacerlo de esta manera escribir un recurso sirven en php como esta

image.php?requestid=..... 

en ese archivo se obtiene RequestID y leer enlace real (enlace local) de la base de datos, leer archivo de imagen a continuación, los datos de salida a navegador

$id = $_GET['requestid']; 
$link = get_local_link_from_id($id); // return /images/file1.png...... 
$data = file_get_contents($link); 
header('Content-Type', 'image/png'); 
echo $data; 

pero creo que no deberías hacer eso, simplemente cambiar el nombre de archivo de forma aleatoria y crear una gran cantidad de ellos ....

+0

Necesitan retener el número original, no es mi sistema, sino según lo solicitado por la persona que me contrató. ¿Y esto es lo suficientemente seguro? siempre que mi script PHP filtre las solicitudes, ¿correcto? – DMor

+0

GET nunca es seguro, incluso POST también puede no ser suficiente para la seguridad. – ilhnctn

+0

@ilis: ¿de qué sirve tu comentario? GET y POST son los métodos utilizados por HTTP, son "inseguros" solo si se usan incorrectamente al interpretar la entrada del usuario. –

1

esto puede ser excesiva para su situtation, pero esta es la forma en que estoy pensando en hacerlo en una aplicación que estoy desarrollando:

primera , hay 4 servidores, un servidor web, un servidor middleware y un servidor de datos

cuando alguien envía una solicitud al servidor web, el servidor web se conecta al servidor de middleware y solicita el archivo, pasando el credencial de usuario como una clave de sesión y el archivo solicitado. el middleware se conecta al DB y valida la sesión y los privilegios de ese archivo. devolverá un error o los datos binarios si tienen acceso. si desactiva el almacenamiento en búfer de salida tanto en el servidor web como en el servidor de middleware, puede enviar 100k bloques desde el servidor de middleware al servidor web, y el servidor web generará el primer bloque mientras recibe el segundo bloque.

el propio archivo puede ser almacenado en el servidor de base de datos a través de FTP, SFTP, o de otro tipo de intercambio de archivos

definitivamente no es tan eficiente como el uso de X-sendfile, pero si alguien es capaz de pwn su servidor web, lo harán todavía no tienen acceso al archivo; en los escenarios anteriores, lo harían. el servidor web es el único servidor público, por lo que el resto de los servidores deben estar conectados a una red privada.

también puede enviar los datos a un servidor de cifrado que cifrar/descifrar los datos reales de los archivos

si alguien tiene alguna idea sobre cómo mejorar en esto, estoy interesado.

+0

Interesante, pero esto es definitivamente más complejo de lo que necesito (pero es interesante de leer). Honestamente, no sabía sobre .htaccess en ese momento y que puede bloquear la visualización de una carpeta completa. Ya lo implementé. Tengo un formulario de inicio de sesión HTML que toma los datos, los envía a un script de procesamiento que valida al usuario, que si se valida, envía al usuario a una página de búsqueda. el usuario introduce un Número de artículo y se envía a otro script de procesamiento que accede a una base de datos con el número como clave principal, que contiene una ruta de archivo y otra información. Si existe, extrae la ruta del archivo – DMor

+0

y la carpeta de imágenes está protegida por .htaccess ("NEGAR DE TODOS"). También uso un SSL y almaceno la otra información con respecto a la imagen en MySQL db – DMor

Cuestiones relacionadas