¿Cuál es el negocio de las mejores prácticas en la validación de nombre de archivo?

StackOverflow https://stackoverflow.com/questions/1870425

  •  18-09-2019
  •  | 
  •  

Pregunta

Tengo un "dilema" y me pregunto ¿cuál es la mejor práctica empresarial.

Estoy usando Uploadify para subir imágenes. Ahora necesito para validar el nombre del archivo antes de guardar el archivo.

He mirado en diferentes soluciones, pero no puedo acceder a uno buena solución.

Aquí están mis criterios:

  • Nombre de archivo debe ser todo en minúsculas
  • Nombre del archivo sólo puede contener charaters [A-z0-9 _-]
  • Debo ser capaz de cambiar el nombre de archivo

¿Cómo usted va sobre si un nombre de archivo es my.file(name).jpeg?

Podría explotar el nombre del archivo en ''. y guardar la extensión, entonces implosionar para obtener el nombre del archivo de nuevo. Pero no estoy seguro si eso es lo mejor Soltion.

Tengo las siguientes funciones que ayuda un poco:

function getExts($filename) 
{ 
    $exts = explode("[/\\.]", $filename) ; 
    $n = count($exts)-1; 
    $exts = $exts[$n]; 
    return $exts; 
}

function validFilename($filename)
{
    $filename = str_replace(" ", "_", $filename);
    $pattern = "/[^[a-z0-9_-]/";
    return preg_replace($pattern, "", strtolower($filename));
} 

ACTUALIZACIÓN 1
Estoy recibiendo el archivo a través $ _FILES. Esto me da los siguientes datos:

  • $ _ FILES [ "archivo"] [ "nombre"] - el nombre del archivo subido
  • $ _ FILES [ "archivo"] [ "tipo"] - el tipo de archivo subido
  • $ _ FILES [ "archivo"] [ "tamaño"] - el tamaño en bytes del archivo cargado
  • $ _ FILES [ "archivo"] [ "tmp_name"] - el nombre de la copia temporal del archivo almacenado en el servidor
  • $ _ FILES [ "archivo"] [ "error"] - el código de error resultante de la carga de archivos

ACTUALIZACIÓN 2
Acabo de encontrar algo. Podría usar getimagesize que devolver una matriz de 7 elementos. Uno de estos elementos [2] es IMAGETYPE_XXX.

Así que trato de utilizar este código:

function getExts2($filename)
{
    list(,,$type) = getimagesize($filename);
    return $type;
}

Pero sólo devuelve el número 2 ...

(también he intentado usar exif_imagetype, pero sólo recibe PHP Error:. Clama a función no definida )

¿Fue útil?

Solución

Comprobar nombre de archivo con expresiones regulares. Utilizar información sobre el tipo MIME. Guardar el archivo en el servidor con el nombre MD5. Almacenar el nombre de archivo real en dB.

Otros consejos

pathinfo () usted reciba el nombre de archivo y extensión. Te advierto que no se puede confiar en las pruebas de la extensión de un archivo a través de la inspección de su nombre de archivo, sin embargo. Usted tendrá que utilizar una función que realmente inspecciona el contenido binario de un archivo para esto. finfo_file () puede lograr esto. Ah, y nunca está de más usar nombre base () en una ruta de archivo proporcionada por el usuario para evitar un camino ataque de recorrido.

Estoy asumiendo que usted está validando los nombres de archivo para su uso posterior como nombres de archivo descarga.

A pesar de que sería muy bueno para preservar los nombres de archivos, ya que son por el bien del usuario, desde un punto de vista técnico, su enfoque suena sonido.

Si usted se preocupa por lo que las direcciones URL se parecen, y puede dirigirse a un público internacional en el futuro, asegúrese de convertir cualquiera de sus acentos o caracteres base para convertirlos. Un usuario alemán (Las diéresis Ä Ö Ü ß) esperaría conversión:

Ä = ae
Ö = oe
Ü = ue

, mientras que los escandinavos parecen estar a gusto con

Ä => a
Ö => o
Ø => o

y así sucesivamente.

Luego están los diferentes caracteres acentuados e a l ...

Dejar caer los conduce por completo a las direcciones URL que busque realmente bd y Strng lok en la dirección de ancho bwsr.

Esto debería hacer todo lo que desee:

$filename = preg_replace('/[^[a-z0-9_-]/', '', str_replace(' ', '_', strtolower(pathinfo($filename, PATHINFO_FILENAME)))) . pathinfo($filename, PATHINFO_EXTENSION);

Y como Pekka explicado, si se quiere sustituir toda la acentuación en el nombre del archivo se puede utilizar la siguiente función:

function Unaccent($string)
{
    return preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8'));
}

No creo que usted debe "validar" el nombre del archivo, sólo debe "arreglar" si no está en el formato que desee. ¿Por qué rechazar un archivo sólo porque alguien aspira a nombrar a sus archivos, o tiene algunos caracteres inusuales ahí? Además, si se trabaja con imágenes, puede utilizar getimagesize como usted ha mencionado para asegurarse de que realmente es una imagen que se cargó (debería fallar si no es una imagen).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top