(1) Nunca use ninguna parte de un nombre de archivo enviado por el usuario en su nombre de archivo almacenado. Desinfectar un nombre de archivo es un trabajo traicionero, no es tan fácil de hacer de manera confiable como se ve en todo, especialmente si su aplicación puede terminar ejecutándose en un servidor Windows o Linux.
Almacénelo como algo así como 2395862.jpeg
, con el nombre de archivo derivado de, por ejemplo, la clave principal de la entidad de base de datos relacionada.
Si necesita presentar un nombre "amigable" al navegador final, use una reescritura para poder servirlo como /avatar/2395862/anyname.jpeg
mientras que en realidad está almacenado como 2395862.jpeg
.
(2) Asegúrese de almacenar los archivos en un directorio separado que no contenga nada más. Este directorio debe ser el único al que el usuario de script web tiene acceso de escritura. Debería tener permisos de bloqueo para que solo se puedan servir archivos estáticos. En Apache, esto debe hacerse desde un .htaccess
o httpd.conf
de nivel superior y las anulaciones desactivadas para que no sea posible que un archivo .htaccess
en este directorio tenga algún efecto.
(3) Es posible que los archivos subidos por el usuario contengan contenido que se enmascara como un tipo diferente. Por ejemplo, en algunos navegadores, la presencia de etiquetas HTML en el archivo puede hacer que traten el archivo como un documento HTML, incluido JavaScript. Los complementos también pueden malinterpretar los archivos que dan lugar a secuencias de comandos entre sitios (consulte el ejemplo del ataque GIFAR).
Por este motivo, debe considerar que cualquier repositorio de archivos cargados por el usuario se vea comprometido por los scripts entre sitios, y mitigue esto al entregar todos los archivos cargados por el usuario desde un dominio diferente. De esa manera, cualquier secuencia de comandos inyectada no podrá cruzar la secuencia de comandos del sitio en su sitio web principal. Asegúrese de que no haya manera de acceder a los recursos cargados por el usuario desde su sitio web principal.
El sitio separado para los recursos de usuario puede ser un dominio completamente diferente, o puede ser un subdominio. Pero si es un subdominio, debe asegurarse de que no haya nada en el dominio principal: por lo tanto, si sirve recursos de usuario de avatars.myforum.com
, su foro principal puede estar en www.myforum.com
pero no debe estar en myforum.com
. De lo contrario, los navegadores compartirán cookies entre ellos.