Управление закачками

Пожалуйста, экспериментируйте в песочнице!

PmWiki включает сценарий называемый upload.php позволяющий пользователям закачивать файлы на вики сервер пользуясь веб броузером. Закачанные файлы (по другому называемые вложения) могут быть легко доступны в помощью разметки на вики страницах. Эта страница рассказывается как установить и настроить функцию закачки.

Некоторые замечания по поводу безопасности

Относительно функции закачки PmWiki занимает отчасти параноидальную позицию. Соответственно, настройки по умолчанию для закачек тяготеют к стремлению ограничить эту функцию как можно сильнее:

  • Закачка по умолчанию запрещена
  • Даже если её разрешить, она защищена паролем
  • Даже если убрать пароль, вы ограничены закачкой файлов с определёнными именами и расширениями(типами)
  • Символы применяемые в именах закачиваемых файлов (по умолчанию) это: буквы, минус, подчёркивание, точка и пробел.
  • Максимальный размер закачиваемого файла весьма мал (по умолчанию 50K)

В таком исполнении возможность повреждений ограничена пока/если администратор вики явно не ослабит ограничения.

Имейте в виду, что позволение пользователям (анонимно!) закачивать файлы на ваш веб сервер влечёт за собой некоторую долю риска. Сценарий upload.php специально разработан для снижения риска, но администраторы вики должны знать, что потенциальная уязвимость существует, и что расконфигурация утилиты закачки может иметь нежелательные последствия.

Изначально, авторизованным пользователям разрешена перезапись файлов до того уже закачаных без возможности восстановления предыдущей версии файла. Если вы хотите запретить пользователям перезаписывать файлы добавьте следующую строку в config.php:

$EnableUploadOverwrite = 0;

По другому, администратор может сохранить предыдущие версии закачек.

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

Базовая установка

Если переменная $EnableUpload в config.php не равна нулю, то stdconfig.php автоматически подключает сценарий upload.php. К тому же, папка для закачивания файлов и URL этой папки на сервере можно установить переменными $UploadDir и $UploadUrlFmt в config.php. Изначально, $UploadDir и $UploadUrlFmt предполагают, что закачанные файлы хранятся в папке с именем uploads/ в текущей папке (обычно содержащую единственный pmwiki.php). Ко всему прочему, config.php также устанавливает начальный пароль закачки (смотри Администрирование паролей).

Таким образом, основной config.php для закачек может выглядеть так:

<?php if (!defined('PmWiki')) exit();
##  Enable uploads and set a site-wide default upload password.
$EnableUpload = 1;
$DefaultPasswords['upload'] = crypt('secret');

Важно: Не создавайте пока папку uploads. Читайте следующий параграф.

Вам может понадобиться явно установить папку для хранения закачек и указать URL отвечающий за эту папку:

$UploadDir = "/home/john/public_html/uploads";
$UploadUrlFmt = [="http://www.john.com/~john/uploads";=]

Закачки могут быть настроены переменной $UploadPrefixFmt для всего сайта, погруппно или постранично. Она указывает будут ли все закачки храниться в одной папке, или в отдельной папке для каждой группы или в отдельной папке каждой страницы. По умолчанию, закачка организована погруппно.

Закачки для всего сайта делаются так:

$UploadPrefixFmt = '';

Чтобы сделать закачку постраничной, воспользуйтесь одним из двух вариантов:

$UploadPrefixFmt = '/$FullName';
$UploadPrefixFmt = '/$Group/$Name';

Папка закачек

Чтобы функция закачки работала хорошо, папка указанная в $UploadDir должна быть записываемой для процесса веб сервера и желательно, чтобы она была доступна через веб (например, в папке public_html). Выполнение PmWiki с включенными закачками выведет приглашение с перечислением шагов требуемых для создания папки закачек на вашем сервере(оно отличается от сервера к серверу).

Закачивание файлов

С тех пор как функция закачки включена, пользователи получают доступ к диалогу закачке посредством приписывания "?action=upload" в конец обычного URL PmWiki. Пользователю будет предлагаться ввести пароль закачки подобно паролям для других страниц (об установке паролей на страницы, группы, и весь сайт смотри Пароли и Администрирование паролей).

Другой способ получить диалог закачки — это вставить разметку "Attach:filename.ext" на существующую страницу, где filename.ext это имя нового файла для закачивания. Когда страница будет показана, '?-ссылка' будет добавлена в конце разметки для доступа автора к странице закачки.

Изначально, PmWiki распределяет закачанные файлы по отдельным папка для каждой группы. Это можно изменить поправив переменную $UploadPrefixFmt. Подробнее читай Cookbook:UploadGroups.

Сохранение версий закачанных файлов

Изначально, PmWiki не поддерживает сохранение версий закачанных файлов. Однако, установив $EnableUploadVersions=1; администратор может включить сохранение старых версий закачанных файлов в папке для закачанных файлов наравне с остальными версиями.

Ограничение закачки файлов для групп и страниц

Пользуясь подстройкой по группам закачка файлов может быть включена только для указанных групп или страниц. Просто установите $EnableUpload=1; для тех групп или страниц, в которых вы желаете включить закачку; или же установите $EnableUpload=1; в файле config.php и установите $EnableUpload=0; в файлах подстройки групп или страниц, где вы хотите запретить закачку.

Ограничение закачки файлов по типам и размеру

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

имя файла
имя закачанного файла может содержать только буквы, цифры, подчёркивания, тире, пробелы и точки. Также имя должно начинаться и заканчиваться буквой или цифрой.
тип файла
для закачивания на веб сервер разрешены файлы только определённых типов, таких как ".gif", ".jpeg", ".doc", и пр. Это жизненно важно для безопасности сервера, так как веб сервер может попытаться выполнить или обработать файлы с расширениями вроде ".php", ".cgi" и т.п.
размер файла
Изначально все закачки ограничены 50-ю килобайтами, что определяется переменной $UploadMaxSize. Таким образом, для ограничения размера всех закачек сотней килобайт просто укажите новое значение для $UploadMaxSize в config.php:
$UploadMaxSize = 102400;

Кроме того, наибольший размер файла также может быть указан для каждого типа закачиваемого файла. Соответственно, администратор может ограничить размер файлов ".gif" и ".jpeg" 20-ю килобайтами, а все остальные типы размером из переменной $UploadMaxSize. Массив $UploadExtSize используется для установки допустимых типов файлов и их максимального размера (в байтах). Например:

$UploadExtSize['gif'] = 20480; # ограничить .gif файлы до 20K

Установка записи в ноль совершенно запрещает закачивать файлы этого типа:

$UploadExtSize['zip'] = 0; # запретить .zip файлы

Добавление новых типов файлов к списку разрешённых

Чтобы добавить новый тип в список разрешённых типов файлов добавьте строчку подобную следующей в файл настройки:

$UploadExts['ext'] = 'content-type';

где ext это добавляемое расширение файла и content-type это тип содержимого (MIME тип) применяемый к файлам с таким расширением. К примеру, для добавления расширения 'dxf' с типом содержимого 'image/x-dxf' добавьте строку:

$UploadExts['dxf'] = 'image/x-dxf';

Каждая запись в $UploadExts должна быть расширением и mime-типов ассоциируемым с этим расширением, например так:

$UploadExts = array(
  'gif' => 'image/gif',
  'jpeg' => 'image/jpeg',
  'jpg' => 'image/jpeg',
  'png' => 'image/png',
  'xxx' => 'yyyy/zzz'
)

Нет необходимости указывать в этом списке типы файлов, которые PmWiki уже знает (сценарий upload.php добавляет умолчания PmWiki для минимальной административной поддержки).

Другой предел размера файла

Если и другие действующие факторы оказывающие влияние на размер закачиваемого файла. В Apache 2.0 есть директива LimitRequestBody управляющая максимальным размеров всего что послано (posted) (включая закачку файлов). Apache по умолчанию считает этот размер неограниченным. Однако, некоторые дистрибутивы Linux (в т.ч. Red Had Linux) ограничивает посылку 512 килобайтами, что требует изменения или увеличения. (Обычно эти настройки находятся в файле конфигурации httpd.conf или в файле /etc/httpd/conf.d.)

Проблема отмеченная в Red Hat 8.0/9.0 с Apache 2.0.x определяется как ошибка "Requested content-length of 670955 is larger than the configured limit of 524288" и выглядит в броузере как "Page not found"(страница не найдена). Попытка изменить указанные выше настройки не помогает с PHP, т.к. у Red Hat 8.0/9.0 есть дополнительный файл настроек для PHP /etc/httpd/conf.d/php.conf. Увеличение числа в строке "LimitRequestBody 524288" решает эту проблему.

PHP сам по себе имеет два ограничения на закачку файла (часто расположеные в /etc/php.ini). Первое — это параметр upload_max_filesize установленный по умолчанию в 2M. Второй — post_max_size со значением по умолчанию 6М.

Максимальный размер закачиваемого файла определяется из наименьшего значения среди трёх переменных: PmWiki наибольший размер файла, предел размера запроса Apache и параметр размера файла PHP.

Защита паролем закачанных файлов

Установка пароля на просмотр для страниц(или групп) предотвращает просмотр и доступ к файлам страницы, но для закрытия прямого доступа к файлам (в папке uploads/) надо сделать следующее:

  • в local/config.php установить $EnableDirectDownload=0;
  • Запретить доступ к папке uploads/ посредством перемещения её за пределы дерева директорий html/ или public_html/, или с помощью файла .htaccess.

Смотри Cookbook:SecureAttachments.

Другие замечания

  • Если закачки всё ещё не работают, убедитесь что ваш установленный PHP позволяет закачки. Файл php.ini(часто /etc/php.ini или /usr/local/lib/php.ini) должен содержать
file_uploads = On

Заметьте, что если вы измените это значение, httpd (веб сервер) должен быть перезапущен (restart). Другой способ проверить разрешены ли закачки на сервере — это установить $EnableDiag=1 (config.php) и вызвать любую страницу с ?action=phpinfo в URL. Переменная "file_uploads" должна иметь значение 1 (если её значение "no value", то это значит — выключено).

<< AuthUser | Документация | Интернационализация >>

Как мне запретить закачку файлов определённого типа?

Вот пример чего надо добавить в ваш файл local/config.php для запрета закачавания .zip файлов:

$UploadExtSize['zip'] = 0; # Запрет закачки .zip файлов.

Перевод страницы PmWiki.UploadsAdmin — Оригинал перевода PmWikiRu.UploadsAdminСсылаются
PmWikiRu.UploadsAdmin: редакция от 10.09.2011 18:48
PmWiki.UploadsAdmin: редакция от 14.01.2022 20:46