Quel est un bon moyen de générer des noms de fichiers / dossiers courts et uniques?

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

  •  03-07-2019
  •  | 
  •  

Question

Les critères sont essentiellement les suivants:

    Les
  • dossiers existeront pendant environ 24 à 48 heures
  • Les noms de dossiers
  • ne peuvent pas être facilement devinés par un utilisateur (s'ils sont utilisés dans une URL)
  • Les noms de dossiers
  • doivent être courts (5-15 caractères)

Réflexions initiales:

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

Détails: Lorsque je télécharge un fichier, je souhaite conserver le nom de fichier unique tel que nommé par le programme de téléchargement. Par conséquent, pour éviter toute collision de noms, je souhaite le placer dans un répertoire uniquement nommé ...

Était-ce utile?

La solution

[Modifier] Attendez une seconde. PHP inclut dans la bibliothèque standard une fonction de générateur d'identifiant unique . Il existe d'autres approches aussi.

Autres conseils

La technique classique ressemble à quelque chose comme

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

    + 20090402

ajout de niveaux, ajout de "a", "b", "c", ... etc. en fonction de la granularité souhaitée.

Cela fonctionne esp. Eh bien, si l'utilisateur se réfère aux fichiers du tout chronologiquement.

Vous finissez par faire quelques énumérations d'existence, mais ce n'est pas si douloureux. Je l'ai utilisé plusieurs fois (y compris avec PHP), principalement parce que la résistance de l'utilisateur est inférieure à celle de toutes les alternatives que j'ai trouvées.

Si vous le souhaitez, vous pouvez embellir les expressions de date - "2009-avr-01", "01h45 du matin", etc.

La langue n'a pas été spécifiée, je ferais en Ruby:

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

=> "f531384b3cc8c60b7c5b7ad087cb0ae4"

Cela ressemble à un "sécurité par l'obscurité". problème. Je déconseille tout ce qui crée des données potentiellement sensibles et les expose (même pour une courte période) de manière sécurisée uniquement parce qu'il est prévu que personne ne devinera l'emplacement. Les attaques par force brute existent et peuvent détruire ce type de "sécurité".

Utilisez la date et l'heure pour générer le nom

Je voudrais utiliser quelque chose comme:

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

Date ('U') renvoie les secondes depuis l’époque Unix (1er janvier 1970 00:00:00 GMT), donc ce sera probablement unique, sauf si vous générez plusieurs dossiers en même temps?

Dans ce cas, changez simplement la valeur de $ salt (faites-en un nom d'utilisateur ou un nombre aléatoire, etc.).

Baser le hachage (md5 ou sha) sur le temps permet de deviner si l'utilisateur sait approximativement quand le répertoire est généré. Tout ce qu'ils ont à faire est de configurer un script simple pour générer toutes les possibilités couvertes quelques secondes de chaque côté, puis d'appuyer sur le site à la recherche d'une réponse. Ajouter du sel, bien que cela aide, ne fait pas beaucoup de bien à long terme.

Pour le PO, ce qui précède s’applique pour toutes les méthodes. Si vous utilisez un serveur très rapide, vous devrez surveiller les résultats par rapport à des répertoires aléatoires. Si vous n’avez que des répertoires de 5 lettres, cela signifie que quelqu'un peut consulter manuellement le site suffisamment de fois pour le découvrir. 15 l’augmente quelque peu, mais avec quelques machines qui le font par script, ce n’est pas une possibilité.

Le standard C ++ a les fonctions tmpfile et tmpnum, les deux à cstdio (stdio.h), et crée un fichier temporaire et un nom de fichier temporaire en conséquence. tmpfile est cependant supprimé à la fin du programme. Je les lierais mais malheureusement, je ne peux pas encore publier de liens.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top