Как разрешить загрузку запрещённых файлов в WordPress

Как разрешить загрузку запрещённых типов файлов в WordPress

WordPress не позволяет загружать в медиабиблиотеку любые файлы подряд — существуют определённые ограничения. Файлы с нестандартными (запрещёнными) типами не могут быть загружены, так как WordPress использует список допустимых форматов файлов, то есть белый список MIME-типов.

Иногда такая защита мешает, и, несмотря на потенциальную опасность, нужно иметь возможность загружать файлы с запрещёнными типами.

В этой статье я покажу, как добавить новый тип файла в белый список загрузок WordPress.

Ошибка при загрузке файла с запрещённым типом

Вот как выглядит ошибка, если, например, вы попытаетесь загрузить файл с расширением .svg:

Ошибка загрузки svg

Разрешение или запрет типов файлов для загрузки в WordPress

В WordPress есть несколько хуков, которые позволяют управлять белым списком расширений файлов:

  • upload_mimes — используется в функции get_allowed_mime_types().
  • wp_check_filetype_and_ext — используется в функции wp_check_filetype_and_ext().

Ниже приведён пример кода, который демонстрирует, как разрешить загрузку нескольких типов файлов (.svg, .doc, .djvu) и как запретить (удалить из белого списка) другие (.mp4a).


add_filter( 'upload_mimes', 'upload_allow_types' );
function upload_allow_types( $mimes ) {
// разрешить новые типы
$mimes['svg'] = 'image/svg+xml';
$mimes['doc'] = 'application/msword';
$mimes['woff'] = 'font/woff';
$mimes['psd'] = 'image/vnd.adobe.photoshop';
$mimes['djv'] = 'image/vnd.djvu';
$mimes['djvu'] = 'image/vnd.djvu';

// отключить существующий тип
// unset( $mimes['mp4a'] );

return $mimes;

}

Объяснение MIME типа: image/svg+xml — это MIME-тип для файлов формата SVG.

Аналогичным образом, вы можете разрешать или запрещать любые другие типы файлов. Список необходимых MIME-типов ��ля белого списка можно найти: список MIME-типов.

Процесс загрузки файла и проверки его типа

  1. Нажмите "Загрузить", выберите файл для загрузки. WordPress отправляет запрос в файл wp-admin/async-upload.php.
  2. Затем WordPress проверяет MIME-тип файла по следующей цепочке:
    • wp-admin/async-upload.php
    • media_handle_upload()
    • wp_handle_upload()
    • _wp_handle_upload()
    • wp_check_filetype_and_ext()
    • wp_check_filetype()

Активация возможности загрузки любых файлов

Возможность unfiltered_html позволяет пользователям (ролям) загружать любые файлы без проверки их типа. Но это правило по умолчанию отключено (по очевидным причинам безопасности). Давайте разберём, что это значит:

Только роли редакторов, администраторов и супер-администраторов имеют эту возможность по умолчанию. Однако независимо от этого, эти роли всегда будут возвращать false для проверки if ( current_user_can('unfiltered_html') ).

Чтобы эта возможность работала, вам нужно "активировать" постоянную ALLOW_UNFILTERED_UPLOADS в файле wp-config.php:


define( 'ALLOW_UNFILTERED_UPLOADS', true );

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

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *