Asegurar la carga del archivo

Escribí un sitio web para una pequeña empresa hace varios años, mientras estudiaba. Me di cuenta de que mis habilidades de seguridad no eran tan buenas como deberían haber sido, y recientemente el sitio fue pirateado y se cargó un código php malicioso utilizando un formulario destinado a la carga de imágenes.

Desde entonces, he pasado al mundo .NET y, aunque sé cómo proteger las cargas de archivos en .NET, realmente no tengo ni idea de cómo hacerlo usando PHP. Lamento no poder proporcionar ningún código fuente y, por lo tanto, no espero que nadie publique ninguna corrección directa para mi código.

Lo que espero es que alguien pueda mostrarme un buen enfoque para el análisis del lado del servidor para asegurar que el contenido cargado del array $ FILES sea de hecho una imagen o un archivo de audio, o al menos que no sea un archivo php .

Me alegro de que preguntaras. Este es un tema complicado, y pocos desarrolladores de aplicaciones son conscientes de los riesgos de seguridad.

Le daré un resumen de los enfoques que debe tomar, y algunos de lectura para obtener más información. Asegúrese de leer la lectura adicional, porque mi resumen es incompleto.

Resumen:

  1. Aloje el contenido subido por el usuario en un dominio diferente. Esta es la defensa más importante y confiable que puede tomar.

  2. Compruebe el tipo MIME del archivo cargado, cuando está cargado, para asegurarse de que esté en una lista blanca de tipos MIME seguros. Genere un nuevo nombre de archivo aleatorio para guardarlo debajo. En el caso de algunos tipos de archivos, como las imágenes, considere volver a codificarlo (por ejemplo, transformar a PNG, o usar ImageMagick para convertirlo de su tipo de archivo al mismo tipo de archivo), ya que esto puede evitar algunos ataques.

  3. Cuando se descarga / recupera el archivo, asegúrese de establecer el Content-Type: explícitamente en el tipo MIME seguro. X-Content-Type-Options: nosniff también un X-Content-Type-Options: nosniff encabezado X-Content-Type-Options: nosniff . Si no tiene la intención de que el archivo se visualice en el navegador, envíe también un encabezado de Content-Disposition: attachment para que el navegador lo trate como una descarga de archivos.

  4. Escanee las cargas de archivos en busca de virus o malware.

Leyendo:

  • ¿Qué pasos deben darse para validar las imágenes cargadas por el usuario dentro de una aplicación?

  • Protección de inhalación MIME

  • ¿Es seguro almacenar y reproducir los tipos de mime proporcionados por el usuario?

  • ¿Es seguro servir a cualquier archivo subido por el usuario solo con los tipos de contenido MIME de la lista blanca?