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' );  

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

Павел.

Paul12_
источник

Ответы:

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.

Gchtr
источник
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
4

Похоже, это может быть связано с этим билетом https://core.trac.wordpress.org/ticket/39552 , похоже, что-то сломалось в 4.7.1

Марк Каплун
источник
Ах, спасибо Марк. Я думал, что-то не так. Надеюсь, это будет исправлено в ближайшее время.
Paul12_
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 необходимо проделать большую работу, поэтому я выбрал тщательно выбирать сражения.

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

MrMesees
источник
Что ж, основная проблема, которая движет всем этим, заключается в том, что до публикации загруженных файлов нет модерации. пытаться угадать, является ли файл злым, основываясь только на его расширении, всегда плохая идея. в теории нет проблем с разрешением всех загрузок администратором, поэтому, хотя некоторые из предложенных исправлений могут быть слишком широкими, на практике они могут быть достаточно хорошими для многих людей. Дополнительное примечание ИМХО 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 очень сильно выровнены
Марк Каплун,