2009-06-26 21 views
9

Necesito desinfectar algunos datos que se usarán en nombres de archivo. Algunos de los datos contienen espacios y caracteres ampersand. ¿Hay alguna función que escape o desinfecte los datos adecuados para usar en un nombre de archivo (o ruta)? No pude encontrar uno en la sección 'Función del sistema de archivos' del manual de PHP.¿Qué caracteres debo escapar/desinfectar para los nombres de archivo?

Entonces, suponiendo que tengo que escribir mi propia función, ¿qué caracteres necesito para escapar (o cambiar)?

Respuesta

5

Si tiene la oportunidad de almacenar el nombre original en una base de datos, simplemente crearía un archivo con un hash aleatorio (mt_rand()/md5/sha1). El beneficio sería que no confíe en el SO subyacente (caracteres/longitud de ruta), el valor o la longitud de la entrada del usuario y, además, es realmente difícil adivinar/falsificar un nombre de archivo. Tal vez incluso una codificación base64 es una opción.

10

Para Windows:

/ \ : * ? " < > | 

Para Unix, técnicamente nada, pero en la práctica la misma lista como Windows sería sensato.

No hay nada de malo con los espacios o los símbolos, siempre y cuando esté preparado para usar comillas en las líneas de comandos cuando manipule los archivos.

(Por cierto, tengo esa lista al tratar de cambiar el nombre de un archivo en Windows a algo que incluye dos puntos, y la copia del mensaje de error.)

2

Cuando desinfecte las cadenas de nombres de archivo, vamos a filtrar todos los caracteres de la imagen 0x20 , así como <,>,:, ", /, \, |,? y *

2

Para Windows, agregue" & "a la lista, si no desea -cualquier efecto secundario. Este es el personaje que dice "el próximo personaje es mi tecla de acceso rápido" en algunas visualizaciones de datos. (Más común en Windows antiguo, pero todavía aparece aquí y allá.) Entonces, en lugar de "M & M", verías "M _M "... el personaje que sigue al ampersand (un espacio) es una "tecla de acceso rápido", y así subrayado.

3

Puede ser una buena idea eliminar todo lo que esté fuera [a-z0-9 _ \ -.]. No es necesario ser así de estricto, pero es cómodo tener una lista de directorios sin sorpresas. Si está trabajando con algunos juegos de caracteres extraños, entonces tal vez quiera convertir la codificación a ascii plano antes de eliminar los caracteres ofensivos (o puede terminar borrando todo) ...

al menos así es como yo hazlo :-)

4

En lugar de filtrar los caracteres, ¿por qué no simplemente permitir [a-z0-9- [email protected]#$%^()]? Sin duda es más fácil que tratar de adivinar cada personaje que podría causar problemas.

Sus usuarios no deberían necesitar un archivo con ningún otro personaje de todos modos, ¿verdad?

+1

De hecho, la lista blanca siempre parece ser la mejor en términos de seguridad/fiabilidad, etc. –

0

Implementación de @merkuro answer:

function getSafeFilesystemFileName() { 
    return (
     md5($id . '-' . $filename) . 
     '.' . pathinfo($filename, PATHINFO_EXTENSION) 
    ); 
} 

Dónde:

  • $id es el ID del registro de la base de datos
  • $filename es nombre de archivo del original de carga (también almacenado en el registro)

Una importante cosa: añada la extensión original en el archivo generado. Si alguna vez necesita dar el archivo a una herramienta que se preocupa por la extensión, será mucho más fácil tenerla disponible que tener que crear un archivo temporal con la extensión.

Cuestiones relacionadas