Диагностика проблемы: почему нужно ограничивать типы загружаемых файлов
В WordPress по умолчанию разрешены многие типы файлов для загрузки, что иногда становится причиной проблем безопасности и некорректной работы сайта. Например, разрешение загрузки исполняемых скриптов или неподдерживаемых форматов может привести к уязвимостям или ошибкам при отображении контента.
Если вы хотите ограничить загрузку файлов только безопасными и необходимыми типами (например, только изображения и PDF), стоит реализовать автоматическую проверку с отклонением неподходящих.
Как проверить текущие разрешённые типы файлов в WordPress
Для начала посмотрите список MIME-типов, разрешённых на вашем сайте. Это можно сделать через консоль WP-CLI или добавив временный код:
add_action('admin_init', function() {
echo '<pre>';
print_r(get_allowed_mime_types());
echo '</pre>';
});Зайдите в админку и обновите страницу — увидите массив с разрешёнными типами. Это поможет понять, что именно стоит ограничить.
Пошаговое решение: фильтрация типов файлов через хук upload_mimes
WordPress предоставляет фильтр upload_mimes, с помощью которого можно изменить список разрешённых MIME-типов.
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
function custom_restrict_upload_mimes($mimes) {
// Разрешённые типы файлов
$allowed = [
'jpg|jpeg|jpe' => 'image/jpeg',
'png' => 'image/png',
'gif' => 'image/gif',
'pdf' => 'application/pdf'
];
return $allowed;
}
add_filter('upload_mimes', 'custom_restrict_upload_mimes');Этот код полностью заменит список разрешённых типов на указанные четыре — JPEG, PNG, GIF и PDF. Остальные файлы будут отклоняться при попытке загрузки.
Как добавить исключения для администратора
Если нужно, чтобы администраторы могли загружать любые файлы, добавьте условие:
function custom_restrict_upload_mimes($mimes) {
if (current_user_can('administrator')) {
return $mimes; // Администраторы без ограничений
}
$allowed = [
'jpg|jpeg|jpe' => 'image/jpeg',
'png' => 'image/png',
'gif' => 'image/gif',
'pdf' => 'application/pdf'
];
return $allowed;
}
add_filter('upload_mimes', 'custom_restrict_upload_mimes');Проверка результата после внедрения
- Попробуйте загрузить файл с разрешённым типом — например, PNG или PDF — через медиабиблиотеку. Загрузка должна пройти успешно.
- Попытайтесь загрузить запрещённый тип — например, SVG, DOCX или PHP-файл. WordPress должен выдать ошибку "Извините, этот тип файла запрещён".
- Проверьте в разных ролях пользователя (админ/редактор/подписчик), если применялись исключения.
Частые ошибки и как их исправить
- Ошибка: "Ошибка загрузки файла" без пояснений.
Проверьте, что MIME-типы в массиве совпадают с форматом файла. Иногда браузер или сервер могут передавать другой MIME. Используйте расширение файла для фильтрации. - SVG загружается, хотя не должен.
SVG по умолчанию запрещён, но если плагин разрешает SVG, отключите его или дополнительно фильтруйте SVG в своём коде. - Администратор тоже не может загружать файлы.
Проверьте условие дляcurrent_user_can('administrator'). Возможно, роль пользователя не соответствует или код подключён с ошибкой. - Кэширование мешает изменениям.
Очистите кэш сайта и браузера после внесения изменений.
Практические советы по безопасности и производительности
- Не разрешайте загрузку исполняемых файлов (
php,exe,js) без веских причин. - Ограничивайте максимальный размер загружаемых файлов через настройки PHP (
upload_max_filesize) и WordPress (фильтрupload_size_limit). - Используйте плагин безопасности для сканирования загружаемых файлов на вирусы.
- Регулярно обновляйте WordPress и плагины, чтобы исключить уязвимости.
Сравнение способов ограничения типов файлов
| Способ | Плюсы | Минусы | Пример |
|---|---|---|---|
Фильтр upload_mimes | Гибко и просто, работает на уровне ядра | Требует кода, нельзя настроить через админку | Код из статьи |
| Плагины типа WP Add Mime Types | Удобный UI, быстро изменить | Дополнительный плагин, возможна перегрузка | WP Add Mime Types |
Изменение через wp-config.php или сервер | Контроль на уровне сервера | Сложно, влияет на все сайты на сервере | php.ini upload_max_filesize |