В WordPress по умолчанию разрешена загрузка множества типов файлов, включая изображения, документы, аудио и видео. Однако иногда возникает необходимость запретить загрузку или обработку определённых типов файлов, чтобы повысить безопасность сайта или ограничить доступ к нежелательным форматам. В этой статье мы подробно рассмотрим, как именно можно запретить загрузку и обработку разных типов файлов в WordPress, используя стандартные средства и добавляя кастомный код.
Почему важно ограничивать типы загружаемых файлов
Разрешение загрузки всех типов файлов без ограничений может привести к серьёзным рискам безопасности. Например, злоумышленник может загрузить PHP-скрипт, переименованный в .jpg, и выполнить его, если сервер настроен неправильно. Также нежелательные форматы могут занимать много места или быть несовместимы с вашим сайтом.
Кроме безопасности, ограничения помогают поддерживать порядок в медиабиблиотеке и упрощают администрирование. Особенно это актуально для сайтов с большим количеством пользователей или магазинов на WordPress.
Как WordPress обрабатывает загрузку файлов: MIME-типы и расширения
При загрузке файлов WordPress проверяет MIME-тип и расширение файла. Эта проверка происходит в функции wp_check_filetype_and_ext(). Встроенный список разрешённых типов файлов можно найти и изменить с помощью фильтра upload_mimes.
Ограничение типов файлов сводится к изменению этого списка, а также дополнительной проверке после загрузки, чтобы предотвратить обход фильтров.
Фильтр upload_mimes для ограничения типов файлов
Самый простой способ запретить загрузку определённых типов файлов — модифицировать список разрешённых MIME-типов с помощью фильтра upload_mimes. Ниже пример, который запрещает загрузку файлов с расширением .exe и .bat:
add_filter('upload_mimes', 'wp_course_restrict_upload_mimes', 10, 1);
function wp_course_restrict_upload_mimes($mimes) {
unset($mimes['exe']);
unset($mimes['bat']);
return $mimes;
}
Этот код нужно добавить в файл functions.php вашей темы или в кастомный плагин. После этого попытка загрузить .exe или .bat файл приведёт к ошибке.
Запрет загрузки по расширению с пользовательским сообщением об ошибке
Иногда нужно не просто убрать тип из списка, а вывести собственное сообщение об ошибке. Для этого можно использовать хук wp_handle_upload_prefilter, который срабатывает перед загрузкой файла.
Пример кода, запрещающего загрузку файлов .svg и .js с объяснением:
add_filter('wp_handle_upload_prefilter', 'wp_course_reject_specific_file_types');
function wp_course_reject_specific_file_types($file) {
$forbidden_extensions = array('svg', 'js');
$file_ext = pathinfo($file['name'], PATHINFO_EXTENSION);
if (in_array(strtolower($file_ext), $forbidden_extensions)) {
$file['error'] = 'Загрузка файлов с расширением .' . $file_ext . ' запрещена по соображениям безопасности.';
}
return $file;
}
Этот подход позволяет гибко управлять запрещёнными типами и давать понятные пользователям сообщения об ошибках.
Использование плагинов для ограничения типов файлов
Если вы предпочитаете не писать код, можно использовать плагины, которые позволяют настроить разрешённые типы файлов через админку.
- WP Upload Restriction — простой плагин для ограничения типов файлов, поддерживает белый и чёрный списки.
- Prevent Upload of Specific File Types — позволяет запретить загрузку по расширениям и MIME-типам.
Для установки плагина перейдите в админку WordPress, раздел «Плагины» → «Добавить новый», найдите нужный плагин и установите. После активации настройте ограничения в его параметрах.
Дополнительные меры безопасности при работе с файлами
Ограничение типов файлов — это только часть комплексной безопасности. Рекомендуется также:
- Отключить выполнение PHP в папках с загруженными файлами через .htaccess.
- Использовать плагины безопасности, например, Clearfy Pro, которые помогают автоматически заблокировать опасные типы.
- Регулярно проверять медиабиблиотеку на подозрительные файлы.
Пример .htaccess для запрета выполнения PHP в uploads
# Запретить выполнение PHP в папке uploads
<FilesMatch "\.php$">
Order deny,allow
Deny from all
</FilesMatch>
Этот файл нужно разместить в директории wp-content/uploads или в её подпапках.
Как дополнительно фильтровать типы файлов при загрузке через REST API
Если на вашем сайте используются кастомные решения с REST API, загрузка файлов может происходить не через стандартный медиа-аплоад. В этом случае полезно добавить фильтрацию в обработчики REST.
Пример фильтра, который запрещает загрузку .exe через REST API:
add_filter('rest_pre_insert_attachment', 'wp_course_rest_restrict_file_types', 10, 2);
function wp_course_rest_restrict_file_types($attachment, $request) {
$file = isset($_FILES['file']) ? $_FILES['file'] : null;
if ($file) {
$ext = pathinfo($file['name'], PATHINFO_EXTENSION);
$forbidden = array('exe', 'bat');
if (in_array(strtolower($ext), $forbidden)) {
return new WP_Error('rest_upload_forbidden', 'Загрузка данного типа файлов запрещена.', array('status' => 403));
}
}
return $attachment;
}
Выводы и рекомендации
Ограничение типов загружаемых файлов — важный шаг для повышения безопасности и поддержания порядка на сайте. Используйте фильтр upload_mimes для базового ограничения, добавляйте проверку через wp_handle_upload_prefilter для пользовательских сообщений об ошибках и не забывайте про серверные меры защиты, такие как запрет выполнения PHP в папках с медиа.
Если вы хотите автоматизировать часть этих процессов и получить дополнительные инструменты безопасности, обратите внимание на плагин Clearfy Pro. Он позволяет гибко управлять безопасностью сайта и ограничениями загрузок без написания кода.