Мусор в именах файлов или прячем наших лебедей (wordpress)

от автора

random_file_names

Вступление

Некоторые камеры категорически отказываются задавать имена файлам на основе timestamp, используя обычный счетчик. В обиходе эта мелочь действительно кажется мелочью, но в интернете вырастает в проблему, позволяющую особо любопытным шерстить сайт в поисках фотографий P1100812.jpg и P1100813.jpg после просмотра P1100811.jpg.

Варианты решения:

  • добавить статичный префикс
  • добавить динамичный префикс

Теперь надо определиться как добавить префикс, сделать ли это через самописный скрипт до загрузки фоток, переименовав все локальные фотографии (сила науки, о нет!) или в момент загрузки на сервер. Не глядя, без вздрогнутых мышц лица, был выбрал вариант «на сервер!».

Техническая реализация:

  • она есть! = пишем ручками
  • её нет! = готовый плагин для wordpress

К счастью или к сожалению, поиск плагинов выдал список outdated на старые версии wordpress. Поэтому вооружившись гуглом и затем np++ было найдено, что:

  • обработка аплоада файлов на плечах /wp-includes/functions.php
  • имя файла *генерируется в функции wp_unique_filename

*генерируется — это я немного загнул, просто проверяется на уникальность/корректность и изменяется в случае, но это, судя по коду, конечная инстанция.

И так, открываем файл functions.php, находим в нем тело функции wp_unique_filename, там строку $filename = sanitize_file_name($filename); и радостно правим её!

Как её править?

Например как (один из вариантов):

  • $filename = crc32(md5(microtime()).sanitize_file_name($filename))."_".sanitize_file_name($filename);
  • $filename = md5(microtime().sanitize_file_name($filename))."_".sanitize_file_name($filename);
  • $filename = crc32("blablabla".microtime().sanitize_file_name($filename))."_".sanitize_file_name($filename);
  • $filename = любые душе угодные хеши php и что-нибудь рандомное.sanitize_file_name($filename);

microtime() — выполняет роль ГПСЧ, выдавая текущее серверное время.

Мы оставляет текущий алгоритм работы wp_unique_filename, лишь добавляя к началу файла наш мусор.

Я для себя выбрал вариант CRC32(магия эльфов)."_".sanitize_file_name($filename);, так как CRC32 не уродует внешне файл (имя), добавляя немножко цыферек/буковок, превращая "random_file_names.png" в удобоваримый "255298064_random_file_names.png", что всяко приятнее глазу чем "ae812e87bbbf3a068807fe763721c38a_random_file_names.png".

Итог: 

  • простое решение в одну строку
  • приватные файлы чуть приватнее (хоть и в паблик системе)

Бонус:
3894406080_P1100810.jpg и 3765414138_P1100811.jpg

P1100810 P1100811

В той же папке есть P1100827.jpg

ссылка на оригинал статьи http://habrahabr.ru/post/257239/