Pregunta

Hola a todos, estoy desarrollando un sitio web para compartir fotos utilizando el marco PHP de CodeIgniter . La idea es que las personas puedan cargar sus fotos, administrarlas (a través de algún tipo de buscador de archivos que les permita crear subcarpetas, arrastrar archivos, etc.) y editarlas (algunas cosas básicas como cambiar el tamaño, rotar y recortar, para comenzar, y más adelante, agregaré algunas funciones avanzadas).

Ya he implementado una solución de autenticación de terceros para CI ( Redux Authentication 2 Beta ) y ahora estoy integrando un administrador de archivos JS / PHP ( AjaxExplorer ), pero El problema es que el backend de PHP para administrar archivos (mover, copiar, etc.) confía demasiado en la entrada del usuario de las llamadas ajax. Por ejemplo, está haciendo cosas como esta (simplificadas por claridad):

move_uploaded_file(

Hola a todos, estoy desarrollando un sitio web para compartir fotos utilizando el marco PHP de CodeIgniter . La idea es que las personas puedan cargar sus fotos, administrarlas (a través de algún tipo de buscador de archivos que les permita crear subcarpetas, arrastrar archivos, etc.) y editarlas (algunas cosas básicas como cambiar el tamaño, rotar y recortar, para comenzar, y más adelante, agregaré algunas funciones avanzadas).

Ya he implementado una solución de autenticación de terceros para CI ( Redux Authentication 2 Beta ) y ahora estoy integrando un administrador de archivos JS / PHP ( AjaxExplorer ), pero El problema es que el backend de PHP para administrar archivos (mover, copiar, etc.) confía demasiado en la entrada del usuario de las llamadas ajax. Por ejemplo, está haciendo cosas como esta (simplificadas por claridad):

<*>

Como puede ver, hay preocupaciones obvias de seguridad, ya que acepta ciegamente cualquier ruta que el usuario introduzca. Ya puedo ver a alguien enviando algo como " ../ AnotherUser / " como el valor $ _POST ['destination_dir'].

Mi pregunta es: ¿Cuál es la mejor manera de " sandbox " ¿Un usuario, para permitirle solo administrar sus propios datos? ¿Acabo de validar y filtrar las entradas, con la esperanza de detectar cada intento de intrusión? ¿Hay bibliotecas / paquetes dedicados a abordar este problema específico?

Creo que este problema debe resolverse de alguna manera en cualquier proyecto (lo suficientemente maduro), lo que brinda a sus usuarios el poder de administrar sus archivos a través de un navegador web, por lo que esperaba encontrar algunas pautas claras sobre esto (ya que hay muchas sobre Inyección SQL, XSS, CSRF, etc.) pero supongo que no estoy usando las palabras clave adecuadas.

FILES['upload']['tmp_name'], $root.$username.

Hola a todos, estoy desarrollando un sitio web para compartir fotos utilizando el marco PHP de CodeIgniter . La idea es que las personas puedan cargar sus fotos, administrarlas (a través de algún tipo de buscador de archivos que les permita crear subcarpetas, arrastrar archivos, etc.) y editarlas (algunas cosas básicas como cambiar el tamaño, rotar y recortar, para comenzar, y más adelante, agregaré algunas funciones avanzadas).

Ya he implementado una solución de autenticación de terceros para CI ( Redux Authentication 2 Beta ) y ahora estoy integrando un administrador de archivos JS / PHP ( AjaxExplorer ), pero El problema es que el backend de PHP para administrar archivos (mover, copiar, etc.) confía demasiado en la entrada del usuario de las llamadas ajax. Por ejemplo, está haciendo cosas como esta (simplificadas por claridad):

<*>

Como puede ver, hay preocupaciones obvias de seguridad, ya que acepta ciegamente cualquier ruta que el usuario introduzca. Ya puedo ver a alguien enviando algo como " ../ AnotherUser / " como el valor $ _POST ['destination_dir'].

Mi pregunta es: ¿Cuál es la mejor manera de " sandbox " ¿Un usuario, para permitirle solo administrar sus propios datos? ¿Acabo de validar y filtrar las entradas, con la esperanza de detectar cada intento de intrusión? ¿Hay bibliotecas / paquetes dedicados a abordar este problema específico?

Creo que este problema debe resolverse de alguna manera en cualquier proyecto (lo suficientemente maduro), lo que brinda a sus usuarios el poder de administrar sus archivos a través de un navegador web, por lo que esperaba encontrar algunas pautas claras sobre esto (ya que hay muchas sobre Inyección SQL, XSS, CSRF, etc.) pero supongo que no estoy usando las palabras clave adecuadas.

POST['destination_dir']);

Como puede ver, hay preocupaciones obvias de seguridad, ya que acepta ciegamente cualquier ruta que el usuario introduzca. Ya puedo ver a alguien enviando algo como " ../ AnotherUser / " como el valor $ _POST ['destination_dir'].

Mi pregunta es: ¿Cuál es la mejor manera de " sandbox " ¿Un usuario, para permitirle solo administrar sus propios datos? ¿Acabo de validar y filtrar las entradas, con la esperanza de detectar cada intento de intrusión? ¿Hay bibliotecas / paquetes dedicados a abordar este problema específico?

Creo que este problema debe resolverse de alguna manera en cualquier proyecto (lo suficientemente maduro), lo que brinda a sus usuarios el poder de administrar sus archivos a través de un navegador web, por lo que esperaba encontrar algunas pautas claras sobre esto (ya que hay muchas sobre Inyección SQL, XSS, CSRF, etc.) pero supongo que no estoy usando las palabras clave adecuadas.

¿Fue útil?

Solución

  

¿Cuál es la mejor manera de " sandbox " ¿Un usuario, para que solo le permita gestionar sus propios datos?

Permita cualquier nombre de archivo / nombre de directorio que el usuario desee, pero simplemente no los use en el sistema de archivos del lado del servidor. En su lugar, escriba los nombres de ruta en una base de datos con una clave principal, y use la clave principal como un nombre de archivo como ‘34256.dat’ en un directorio de almacenamiento plano (o incluso como un BLOB en la base de datos si lo prefiere). Luego, realice la entrega a través de un script de descarga o reescritura de URL para que aparezca el nombre de archivo deseado en la URL.

La eliminación de los nombres de archivo entrantes es difícil . Detectar ‘..’ es solo el comienzo. Nombres de archivo demasiado largos; nombres de archivo demasiado cortos; combinaciones de puntos iniciales y finales; combinaciones de espacios en blanco iniciales y finales; Los diferentes separadores de directorios de diferentes plataformas. personajes que no son válidos en algunas plataformas; personajes de control; Los caracteres Unicode y las formas específicas del entorno para abordarlos; ADSs; nombres de archivos ('.htaccess') o extensiones ('.php', '.cgi') que pueden ser 'especiales' para su servidor web; Nombres de archivo reservados de Windows ...

Puede pasar toda una vida rastreando pequeñas y divertidas peculiaridades de las reglas de ruta de archivos en varias plataformas, o simplemente puede olvidarlo y usar la base de datos.

Otros consejos

No estoy seguro de cómo se ve tu destination_dir , pero lo que pensé fue en asignar claves de directorios y luego obtener el directorio basado en esa clave. Por ejemplo:

//

No estoy seguro de cómo se ve tu destination_dir , pero lo que pensé fue en asignar claves de directorios y luego obtener el directorio basado en esa clave. Por ejemplo:

<*>

Sin embargo, tienes que predefinir las teclas de antemano. Otra alternativa podría ser la opuesta: md5 / sha1 la entrada y úsala como dir_inicial de destino, luego almacena esa clave en la base de datos con la etiqueta asociada.

POST['destination_dir'] = '4hg43h5g453j45b3'; *_query('SELECT dir FROM destinations WHERE key = ? LIMIT 1'); //etc.

Sin embargo, tienes que predefinir las teclas de antemano. Otra alternativa podría ser la opuesta: md5 / sha1 la entrada y úsala como dir_inicial de destino, luego almacena esa clave en la base de datos con la etiqueta asociada.

No hay ninguna biblioteca que yo sepa.
Sin embargo, en su ejemplo particular, elimine todas las barras y puntos (atrás) de la cadena y luego agregue una barra al final, de esa forma el usuario no puede cambiar las carpetas.

$destdir = str_replace(array('.', '/', '\\'), '', 

No hay ninguna biblioteca que yo sepa.
Sin embargo, en su ejemplo particular, elimine todas las barras y puntos (atrás) de la cadena y luego agregue una barra al final, de esa forma el usuario no puede cambiar las carpetas.

<*>POST['destination_dir']); $destdir .= "/";
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top