Carga de archivos PHP: Orden de medidas de seguridad

1

En un formulario de carga de archivos PHP, el nombre y la extensión del archivo se deben cambiar para evitar ataques de directorio. No entiendo completamente estos ataques, por lo que no estoy seguro de que algunos de mis otros controles de seguridad sean propensos a ellos.

Quiero verificar el tamaño del archivo y el tipo mime:

$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $file['tmp_name']);
$filesize = filesize($file['tmp_name']);
// check content of variables here

Después de eso, quiero mover el archivo del directorio tmp al lugar donde deben guardarse permanentemente con un nombre de archivo seguro.

¿Es seguro el código anterior o debo mover el archivo primero y luego hacer otras comprobaciones de seguridad para evitar el uso de $file['tmp_name'] (excepto para mover el archivo)?

    
pregunta kot 22.04.2017 - 00:37
fuente

3 respuestas

1

Sí, primero debe validar el archivo y luego moverlo.

Si lo mueve primero, lo valida y luego lo elimina si no es válido, un atacante tendría una pequeña ventana donde es posible un ataque.

Aparte de eso, tmp_name es seguro de usar ya que es no controlado por el usuario , por lo que no hay Razón para evitar su uso. Tenga en cuenta también que la finfo mime type check puede omitirse en algunas situaciones. Esa es también una de las razones para cambiar el nombre del archivo. El recorrido del directorio generalmente no es posible con el "nombre" de $ _FILES, pero cambiar el nombre del archivo, incluida la extensión, puede impedir la ejecución del archivo como archivo PHP (por ejemplo, defensas adicionales serían almacenar el archivo fuera de la raíz web para que no se puede acceder directamente).

    
respondido por el tim 22.04.2017 - 11:16
fuente
1

el nombre y la extensión del archivo deben cambiarse para evitar los ataques de inclusión de archivos locales (y algunos otros ataques ocultos de shell locales), no los ataques transversales de directorios, que se basan en la ruta.

  

Quiero verificar el tamaño del archivo y el tipo mime:

Usar finfo es la forma de verificar el tipo mime. Pero ¿por qué revisar el tamaño? Si desea poner un límite superior en el tamaño de las subidas, hágalo en la configuración del servidor web (sin embargo, configure sus límites POST), en PHP (upload_max_filesize) y también recomendaría verificar también en el cliente .

Siempre que valide la entrada, debe hacerlo lo antes posible en el ciclo de procesamiento. Así que antes de moverlo desde la ubicación temporal.

    
respondido por el symcbean 22.04.2017 - 19:35
fuente
-1

El problema que está encontrando aquí es un problema muy común. Sé que no se puede encontrar mucha información sobre la seguridad de la carga de archivos, y así fue como mi servidor fue hackeado en algún momento.

Después de un tiempo e investigación, tengo algunos consejos para cargar archivos de usuarios seguros en su servidor:

Extensiones de carga de archivos
La verificación de la extensión de carga de archivos puede ser muy útil para ralentizar a los piratas informáticos o para detener a los piratas informáticos que no saben mucho de piratería. Sin embargo, esto no es suficiente para mantener todo seguro, ya que se puede evitar.

Forzando la extensión de archivo
Si las personas solo están cargando archivos de texto o imágenes, tiene la opción de no usar la extensión del archivo cargado. En su lugar, puede hacer que se coloque el código en la extensión de archivo; esto posiblemente puede impedir que cualquier código se ejecute en el archivo cargado. Digamos, por ejemplo, que solo permite que se carguen las imágenes, luego haga que se coloque el código en la extensión de archivo ".png" o ".jpg" al final del nombre del archivo cuando lo cargue en el servidor.

Permiso de solo lectura
¡Este es por mucho el consejo más importante en mi lista! Cuando se cargan los archivos, establezca sus permisos para leer solo junto con la carpeta en la que está almacenado. Nunca desea que se le permita el permiso de ejecución porque el servidor posiblemente puede ejecutar el código cargado por un atacante.

    
respondido por el UnderMyWheel 22.04.2017 - 23:09
fuente

Lea otras preguntas en las etiquetas