Имена файлов временного файла PHP для столкновения загрузок

При просмотре html кажется, что div с фоном не содержит форму div

9
задан pinkgothic 5 May 2011 в 14:42
поделиться

5 ответов

Это кажется, что что-то серьезно неправильно или с Вашей установкой PHP или с какой бы ни системный вызов PHP внутренне использует для генерации случайных имен файлов (наиболее вероятный tempnam).

Для всех остальных: дескрипторы PHP загруженные файлы внутренне перед пользовательским кодом когда-либо обрабатываются. Эти имена хранятся в $_FILES['file']['tmp_name'] (где 'файл' является (заключенным в кавычки) названием входного элемента файла на форме).

4
ответ дан 4 December 2019 в 21:51
поделиться

Переместите свои файлы в пользовательский dir после того, как они будут загружены. Те временные файлы должны быть удалены.

0
ответ дан 4 December 2019 в 21:51
поделиться

PHP, работающий под апачем, как mod_php?

Можно попытаться создать временный каталог загрузки для каждого процесса, имя которого содержит php getmypid(), затем ini_set Ваш процесс PHP upload_tmp_dir к тому каталогу. Это не будет работать если новое php процесс порожден для каждого запроса.

2
ответ дан 4 December 2019 в 21:51
поделиться

Я рекомендовал бы использовать генератор GUID для имени файла, видя, что Вы получаете так многих.

-1
ответ дан 4 December 2019 в 21:51
поделиться

После поиска соответствующего кода до _gettemp в реализации libc FreeBSD 7 я не понимаю, как содержимое файла tmp_name могло быть недействительным. (Чтобы отследить это, вы можете загрузить копию PHP 5.2.8 и прочитать в main / rfc1867.c - строка 1018 вызывает в main / php_open_hibited_file.c , функция начинается с строка 227, которая выполняет свою основную работу в функции, начинающейся в строке 97, которая, однако, является, по сути, просто оболочкой для mkstemp в вашей системе, которая находится в реализации FreeBSD libc в строке 66 (ссылка ), который использует _gettemp (то же, что и выше) для фактического создания случайного имени файла. Однако справочная страница для mkstemp упоминает в разделе ОШИБКИ, что arc4random () функция не реентерабельна. Возможно возможно, что 2 одновременных запроса входят в критическую секцию кода и возвращают одно и то же tmp_name - я слишком мало знаю о том, как Apache работает с либо mod_php, либо php-cgi, чтобы прокомментировать там (хотя использование FastCGI / php-cgi может работать - я не могу комментировать успешно y в это время).

Однако, стремясь к простейшему решению, если вы не совсем понимаете, что сам файл tmp_name недействителен, но вместо этого конфликтует с другими загруженными файлами (например, если вы используете часть имени файла tmp_name в качестве вашей единственный источник уникальности в сохраненном имени файла), вы можете столкнуться с коллизиями из-за парадокса дня рождения другом вопросе вы упоминаете, что нужно переместить около 5 000 000 файлов, а в еще одном вопросе вы упоминаете получение 30-40 000 загрузок в день. Это кажется мне идеальной ситуацией для парадокса дня рождения. На странице руководства mktemp упоминается, что (при использовании шести 'X', как в PHP) существует 56 800 235 584 возможных имени файла (62 ** 6 или 62 ** n, где n = количество 'X' и т. Д.) . Однако, учитывая, что у вас более 5 миллионов файлов, вероятность коллизии составляет приблизительно 100% (другая эвристика предполагает, что вы уже столкнулись примерно с 220 коллизиями, если ((files * (files-1)) / 2) / (62 ** 6) означает что угодно, где files = 5 000 000). Если это проблема, с которой вы столкнулись (вероятно, , если не добавляет дополнительную энтропию к сгенерированному загруженному имени файла), вы можете попробовать что-то вроде move_uploaded_file ($ file ['tmp_name'], UPLOADS.sha1 (mt_rand (). $ file ['tmp_name']). strrchr ($ file ['name'], '.')) - идея состоит в том, чтобы добавить больше случайности к случайному имени файла, предотвращая коллизии. Альтернативой может быть добавление еще двух «крестиков» в строку 134 main / php_open_ Contemporary_file.c и повторная компиляция.

4
ответ дан 4 December 2019 в 21:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: