Каков хороший способ создания коротких и уникальных имен файлов/папок?

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

  •  03-07-2019
  •  | 
  •  

Вопрос

Критерии в основном такие:

  • папки будут существовать около 24-48 часов
  • имена папок не могут быть легко угаданы пользователем (если они используются в URL-адресе)
  • имена папок должны быть короткими (5–15 символов).

Первоначальные мысли:

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

Подробности:При загрузке файла я в основном хочу сохранить уникальное имя файла, указанное загрузчиком, поэтому, чтобы избежать конфликта имен, я хотел бы поместить его в каталог с уникальным именем...

Это было полезно?

Решение

[Редактировать] Подождите секунду.PHP включает прямо в стандартную библиотеку уникальная функция генератора идентификаторов.Есть другие подходы слишком.

Другие советы

Классическая техника выглядит примерно так

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

    + 20090402

добавление уровней, добавление «a», «b», «c», ...и т. д.на основе желаемой детализации.

Это работает, особенно.хорошо, если пользователь вообще относится к файлам в хронологическом порядке.

В конечном итоге вы выполняете несколько перечислений существования, но это не так уж и болезненно.Я использовал это много раз (в том числе с PHP), главным образом потому, что сопротивление пользователей ниже, чем у любой альтернативы, которую я нашел.

Если вам так хочется, вы можете украсить выражения даты - «2009-апрель-01», «01:45» и т. д.

Язык не указан, в Ruby я бы сделал:

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

=> "f531384b3cc8c60b7c5b7ad087cb0ae4"

Это звучит как проблема «безопасности через неизвестность».Я бы рекомендовал избегать всего, что создает потенциально конфиденциальные данные и раскрывает их (даже на короткое время) безопасным способом только потому, что есть ожидание, что никто не угадает их местоположение.Атаки грубой силы существуют, и они могут разрушить этот тип «безопасности».

Используйте дату и время, чтобы сгенерировать имя.

Я бы использовал что-то вроде:

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

Date('U') возвращает количество секунд, прошедших с эпохи Unix (1 января 1970 г., 00:00:00 по Гринвичу), так что, вероятно, оно будет уникальным, если вы не создаете несколько папок одновременно?

В этом случае просто слегка измените значение $salt (сделайте его именем пользователя или случайным числом и т. д.).

Основание хэша (md5 или sha) на времени позволяет угадать, знает ли пользователь примерно, когда создается каталог.Все, что им нужно сделать, это настроить простой скрипт, который за несколько секунд сгенерирует все возможные варианты с каждой стороны, а затем зайти на сайт в поисках ответа.Добавление соли хоть и поможет, но в долгосрочной перспективе не принесет особой пользы.

Для ФП вышеизложенное справедливо для любого метода.Если у вас очень быстрый сервер, вам нужно будет отслеживать попадания в случайные каталоги.Наличие только 5-буквенных каталогов означает, что кто-то может вручную зайти на сайт достаточное количество раз, чтобы обнаружить каталог.15 несколько увеличивает это значение, но, учитывая, что несколько машин делают это по сценарию, это вполне возможно.

Стандарт C++ имеет функции tmpfile и tmpnum, обе в cstdio (stdio.h), и соответственно создает временный файл и имя временного файла.Однако tmpfile удаляется в конце программы.Я бы дал ссылку на них, но, к сожалению, пока не могу публиковать ссылки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top