¿Cuál es una buena manera de generar nombres de archivo / carpeta cortos y únicos?

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

  •  03-07-2019
  •  | 
  •  

Pregunta

El criterio es básicamente este:

  • las carpetas existirán durante aproximadamente 24-48hrs
  • los nombres de carpetas no pueden ser fácilmente adivinables por un usuario (si se usa en una URL)
  • los nombres de las carpetas deben ser cortos de 5 a 15 caracteres

Pensamientos iniciales:

printf('%u',crc32(microtime(true)));

Detalles: Al cargar un archivo, básicamente quiero mantener el nombre de archivo único como lo nombra el cargador, por lo que para evitar cualquier colisión de nombres, me gustaría ponerlo en un directorio con un nombre único ...

¿Fue útil?

Solución

[Editar] Espera un segundo. PHP incluye directamente en la biblioteca estándar una función única de generador de identificación . Hay otros enfoques también.

Otros consejos

La técnica clásica se parece a

  + uploader-name  
    + 20090401
      + 010000     // hhmmss
      + 013000     // hhmmss
      + 014500     // hhmmss
    ...

    + 20090402

agregando niveles, agregando " a " ;, " b " ;, " c " ;, ... etc. según la granularidad deseada.

Esto funciona especialmente. bueno, si el usuario se relaciona con los archivos cronológicamente.

Terminas haciendo algunas enumeraciones de existencia, pero no es tan doloroso. Lo he usado muchas veces (incluso con PHP), principalmente porque la resistencia del usuario es menor que para cualquier alternativa que he encontrado.

Si está tan inclinado, puede embellecer las expresiones de fecha - "2009-Apr-01", "" 01:45 AM" ;, etc.

El idioma no se especificó, en Ruby haría:

require 'digest/md5'
Digest::MD5.hexdigest(Time.now.to_s)

=> "f531384b3cc8c60b7c5b7ad087cb0ae4"

Esto suena como una "seguridad por oscuridad" problema. Recomendaría contra todo lo que cree datos potencialmente confidenciales y los exponga (incluso por un corto tiempo) de una manera segura solo porque existe la expectativa de que nadie adivine la ubicación. Existen ataques de fuerza bruta, y pueden destrozar este tipo de "seguridad".

Use la fecha y la hora para generar el nombre

Usaría algo como:

$salt='Whatever you want';
$folderName=SHA1($salt.date('U'));

Date ('U') devuelve los segundos desde la época de Unix (1 de enero de 1970 00:00:00 GMT), por lo que probablemente será único a menos que esté generando varias carpetas al mismo tiempo.

En ese caso, solo cambie sutilmente el valor de $ salt (conviértalo en un nombre de usuario o un número aleatorio, etc.).

Al basar el hash (ya sea md5 o sha) en el tiempo, se puede adivinar si el usuario sabe aproximadamente cuándo se genera el directorio. Todo lo que necesitan hacer es configurar un script simple para generar todas las posibilidades cubiertas unos segundos a cada lado y luego ir al sitio en busca de una respuesta. Agregar sal, aunque ayudará, no hace mucho bien a largo plazo.

Para el OP, lo anterior es válido para cualquier método. Si está ejecutando un servidor muy rápido, necesitará monitorear los hits contra directorios aleatorios. Solo tener directorios de 5 letras significa que alguien podría acceder manualmente al sitio las veces suficientes para descubrir el directorio. 15 lo aumenta un poco, pero con algunas máquinas que lo hacen de forma programada, no está fuera de posibilidad.

El estándar C ++ tiene las funciones tmpfile y tmpnum, ambas en cstdio (stdio.h), y crea un archivo temporal y un nombre de archivo temporal en consecuencia. Sin embargo, tmpfile se elimina al final del programa. Los enlazaría pero lamentablemente no puedo publicar enlaces todavía.

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