Imagen de publicación desde la raíz del servidor web externo

1

Está almacenando una imagen fuera de la raíz del servidor web con un nuevo nombre y extensión (por ejemplo, usando move_uploaded_file($_FILES['userfile']['tmp_name'],'../uploads/'.date('U').'png') - no exactamente esto, obviamente, ya que date('U') no es único, y el archivo de carga debería ejecutarse desde el raíz del servidor web) y cargarlo con readfile() suficiente para asegurar un formulario de carga de imagen? Si no es así, ¿qué tipo de ataques podrían superar esto (por ejemplo, ejecutar código php arbitrario, ejecutar javascript en el cliente, etc.)?

    
pregunta macleos 10.02.2017 - 15:54
fuente

1 respuesta

1

Sí, guardar los archivos fuera de la raíz web reducirá su superficie de ataque para referencias directas de objetos. También recomendaría hacer lo siguiente:

  1. Valide el archivo al cargar: verifique el tipo de mime del archivo contra una lista blanca de tipos de imagen válidos. Además, compruebe el tipo mime de los bytes subidos. No confíes en lo que el navegador te dijo archivo fue.
  2. Asigne un nombre aleatorio al archivo. Puede adjuntar un     marca de tiempo hasta el final del nombre de archivo si le preocupa     unicidad. Si el usuario puede cargar un archivo malicioso, un     nombre aleatorio hará que sea más difícil para ellos hacer referencia a ese archivo y     tener algún proceso de servidor web ejecutarlo.
  3. No busque el archivo según la entrada controlada por el usuario. Esto puede dejarlo abierto a la ruta a través de la ruta / referencia más directa del objeto (especificando otro archivo, al cual no deberían tener acceso).

El vector de ataque principal que puede habilitar la carga de un archivo es la inclusión de archivos locales, también conocido como. ejecutando código arbitrario en su servidor. Esto podría incluir ejecutar código php arbitrario y actualizar los archivos javascript. Incluso podría dar lugar a que el servidor se vea comprometido en función de los permisos de la cuenta de usuario en la que se ejecuta su servidor web.

    
respondido por el user52472 10.02.2017 - 18:46
fuente

Lea otras preguntas en las etiquetas