Se debe tener en cuenta que un archivo no tiene un "tipo de contenido" inherente per se. Un archivo es un grupo de bytes y tiene un nombre. Cuando descarga un archivo desde un servidor web, el servidor infiere un tipo de contenido (como "aplicación / pdf") de cualquier pista que pueda encontrar, principalmente la llamada "extensión" (la pocas letras al final del nombre del archivo; por ejemplo, se supone que " .pdf
" indica un archivo PDF) y, a veces, el contenido del archivo: por ejemplo, cuando un servidor web distribuye un archivo HTML, también se ve dentro del archivo encabezado para una etiqueta "meta" que anularía la opción predeterminada para Tipo de contenido, como este:
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
</head>
Así que tienes dos operaciones en tu servidor: subir y descargar. La carga es mayormente segura: el archivo viene y se almacena. La descarga puede ser una preocupación: cuando un administrador descargará un archivo, lo hará haciendo clic en algún enlace dentro de un navegador web, y el servidor web deducirá un tipo de contenido, como se describe anteriormente. El navegador web utilizará el tipo de contenido para decidir qué hacer con el archivo descargado, y esto no necesariamente es "sugerir al usuario que lo guarde en algún lugar". Por ejemplo, si alguien carga un archivo .html
, el navegador web lo interpretará como HTML, lo mostrará y posiblemente ejecutará cualquier Javascript que esté en él. Además, el archivo provendrá de su propio servidor, por lo que es probable que el navegador web del administrador confíe en ese archivo de forma predeterminada. Varias cosas desagradables pueden suceder en ese punto.
Por lo tanto, debe filtrar los tipos de contenido bajo los cuales servirá los archivos cuando se descarguen; y tenga en cuenta el nombre del archivo, ya que incluso si el archivo se guarda en el sistema del administrador, puede ser un archivo .exe
que el administrador ejecutará al hacer clic en él.
Además, permitir que aparezca cualquier tipo de archivo en su servidor puede ser una herramienta indirecta para aprovechar un ataque. Hay algunos agujeros de seguridad en los que el atacante puede forzar de algún modo la ejecución de un archivo arbitrario en el servidor; un mecanismo de carga sin filtro permite al atacante empujar primero exactamente el tipo de archivo ejecutable que le gustaría ver ejecutado en el servidor.