SVG-файлы не загружаются с момента последнего обновления WP


16

В моих функциях есть файл PHP, который позволяет загружать файлы SVG. После обновления до последней версии WP сегодня я больше не могу загружать svgs. Я также попробовал второй фрагмент кода с сайта CSS tricks, и он тоже не работает.

Кто-нибудь знает а) что могло быть причиной последнего обновления и б) Кто-нибудь знает обходной путь?

Вот код, который я обычно использую:

function svg_mime_types( $mimes ) {
   mimes['svg'] = 'image/svg+xml';
   return $mimes;}
add_filter( 'upload_mimes', 'svg_mime_types' );  

Большое спасибо

Павел.

Ответы:


16

В WordPress 4.7.1 было внесено изменение, которое проверяет тип MIME загруженного файла. Это нарушает загрузку файлов таких типов, как SVG или DOCX. Уже есть заявки на эту проблему в WordPress Core, где вы можете прочитать больше об этом:

Временный и рекомендуемый обходной путь ( в течение времени , пока эта проблема не будет устранена) является следующим плагиным:
Отключить Real MIME Check

Если вы не хотите использовать этот плагин, вот та же функциональность:

add_filter( 'wp_check_filetype_and_ext', function($data, $file, $filename, $mimes) {
    global $wp_version;

    if ( '4.7.2' !== $wp_version ) {
       return $data;
    }

    $filetype = wp_check_filetype( $filename, $mimes );

    return [
        'ext'             => $filetype['ext'],
        'type'            => $filetype['type'],
        'proper_filename' => $data['proper_filename']
    ];

}, 10, 4 );

Обратите внимание, что в этот отсканированный файл включена проверка версии, чтобы отключить исправление сразу после обновления WordPress.

редактировать

Первоначально проблема была решена в 4.7.2. Но так как 4.7.2 был срочным выпуском безопасности , исправление не вошло в эту версию. Теперь это должно быть исправлено в 4.7.3.


2
Альтернативный обходной путь для сред разработки: добавить define( 'ALLOW_UNFILTERED_UPLOADS', true );в wp-config.php. Это не безопасно для производства.
— Тим Мэлоун

1
Просто для того, чтобы собрать всю информацию в одном месте, есть также соответствующая ветка на форуме: wordpress.org/support/topic/wp-4-7-1-kills-svg
— Тим Мэлоун

Спасибо за это. На данный момент это не срочная ситуация, но приятно знать, что есть обходной путь. Очень ценится.
— Paul12_

Внедряет слишком широкий диапазон эффектов, если он не проверяет специально, 'svg' === strtolower($filetype['ext']);и не вводит больше работы в том случае, если работа не требуется (в основном) или если файл не относится к типу svg ...
— MrMesees


2

Кажется, никто не работал с тем, что есть, и это очень плохо, вот как я справился ...

История / История

Я создал загрузчик SVG в 2015 году, основываясь на статье о хитростях CSS и взгляде на то, что было. Я также получил сетку, работающую для предварительного просмотра изображения, и использовал несколько других исправлений. Простой плагин (плагины типа файлов IMO должны быть простыми)

Решение

Произошло несколько изменений для 4.7. Настоящая PITA заключалась в том, что для image/типов пантомимы WP теперь использует GD на изображениях. Чтобы обойти это, я установил svgрасширение, application/svg+xmlчтобы GD не связывался с файлом.

Обновление: с 4.7.2 в некоторых случаях вспыхнула яркая искра

Затем, через крючок, мы возвращаем его обратно image/svg+xml. Это то же самое, что и в других ответах, но мы сначала привязываем его к нашему конкретному случаю, чтобы устранить эффекты (это файл SVG); мы можем рассчитывать на чтение $data['ext'](должна быть дешевле, чем функция, чтобы получить информацию о файле только как одно сравнение и один доступ к массиву / хэшу).

Обновить: состоянию на 4.7.2 $data['ext']не всегда устанавливается, поэтому мы теперь, если его длина составляет <1, извлекают (потенциально небезопасно) расширение из имени файла, используя strtolower(end(explode('.', $filename))). Причина, по которой я действительно борюсь с использованием FileInfo, заключается в том, что, по сути, полагаться на расширение PHP слишком непрозрачно и не всегда будет работать для всех (особенно для тех, кто компилирует без или без доступа для включения расширений, если его там нет). Я хотел бы что-то, что работает вместо расширения. Больше не FileInfoнужно иметь правильную информацию, поэтому для тех, кто доверяет выводу и имеет расширение (я полагаю, по умолчанию в 5.6+), оно должно работать. Кроме того, поскольку это плагин, он не модифицирует ядро, поэтому вы можете отключить этот код или отменить регистрацию.

https://github.com/Lewiscowles1986/WordPressSVGPlugin

Видеть

Другие обходные пути

Разрешение нефильтрованных загрузок - это ужасное решение, потому что, как другие говорили, что, связываясь с этим потоком, люди могут загружать php-файлы через загрузчик медиа (это плохо, и если вы это сделаете, вам следует остановиться и подумать!)

Принудительное выполнение каждого файла через любую функцию без проверок (как ни странно, если image/ mime-тип, вы не можете просто простую проверку ext). Это имеет потенциал для создания гораздо более широких эффектов для решения относительно нишевой проблемы и увеличивает общую нагрузку (предостережение, что мой плагин также вводит больше работы для администраторов, чтобы заставить работать пользовательский интерфейс администратора).

Если мы оставим mime как application / svg + xml и просто отфильтруем типы mime, которые будет загружать изображение, но AFAIK потребует исправления, которые будут использоваться в качестве избранного изображения и т. Д. Для обеспечения универсальной работы с SVG необходимо проделать большую работу, поэтому я выбрал тщательно выбирать сражения.

Надеюсь это поможет.


Что ж, основная проблема, которая движет всем этим, заключается в том, что до публикации загруженных файлов нет модерации. пытаться угадать, является ли файл злым, основываясь только на его расширении, всегда плохая идея. в теории нет проблем с разрешением всех загрузок администратором, поэтому, хотя некоторые из предложенных исправлений могут быть слишком широкими, на практике они могут быть достаточно хорошими для многих людей. Дополнительное примечание ИМХО SVG - такая же картинка, как PDF, технически это не так.
— Марк Каплун

кто бы ни придумал mime-типы, не согласен с вами, как и производители браузеров и производители программного обеспечения во всем мире. WordPress проверяет только расширения, потому что он не предназначен для обеспечения безопасности сети, и это нормально (по той же причине, что офис Microsoft не припарковал ваш автомобиль). Гиперболично, по крайней мере, сказать, что WP должен выполнять гораздо больше проверок, чем поверхностных, но я согласен, что нужно больше работы по обеспечению безопасности, но не то, чтобы WP был подходящим средством для этой работы (он почти слишком большой как есть)
— MrMesees

на самом деле браузеры проверяют содержимое в самых разных ситуациях developer.mozilla.org/en-US/docs/Mozilla/… и они никогда не смотрят на расширение. И да, никто не ожидает, что WordPress на данный момент сосредоточится на усилении безопасности;)
— Марк Каплун

Во-первых, одна статья в блоге одного браузера! = Все браузеры. Я знаю, что Chrome обращает внимание на пантомиму. Во-вторых, самоанализ файлов следует правилам; это не свободная форма, как предполагает свободный язык. Более всесторонняя валидация меняет производительность на гибкость (она работает на клиентах на одном ПК, а не на публичных предложениях для нескольких пользователей). Чтобы доказать это, откройте Firefox, откройте 100 вкладок и посмотрите на использование памяти и ЦП. Попробуйте то же самое со 100 запросами на сайт! Последнее, пожалуйста, прекратите, если у вас нет фактических фактов, чтобы добавить не отступления. Это довольно обостряет и никому не приносит пользы.
— MrMesees

проверка 256 первых байтов только что загруженного файла приведет к практически нулевому снижению производительности, так как файл, вероятно, находится в памяти или кэш-памяти SSD, и в любом случае он побледнеет, если сравнить его с ударом производительности при изменении размера файлов, создании эскиза и не. Что касается других браузеров, не совсем в том же потоке кода, но из этого stackoverflow.com/questions/1201945/… Необоснованно полагать, что chrome и firefox очень сильно выровнены
— Марк Каплун,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.