SVG-файли не завантажуються з часу останнього оновлення WP


16

Я маю фрагмент у своїх функціях PHP-файл, який дозволяє завантажувати файли SVG. З моменту оновлення до останньої версії WP сьогодні я більше не можу завантажувати svgs. Я також спробував другий фрагмент коду з веб-сайту трюків CSS, який теж не працює.

Хтось знає: а) що могло спричинити це з останнім оновленням; і b) хтось знає, що може обійтися.

Ось код, яким я зазвичай користуюся:

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-Tricks, що розглядає, що було. Я також отримав сітку, яка працює для попереднього перегляду зображень, і використала кілька інших виправлень. Простий плагін (плагіни типу IMO повинні бути простими)

Рішення

Було кілька змін за 4.7. Справжнім PITA було те, що для image/типів mime 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 вимагав би виправлення, щоб вони використовувались як зображене зображення і т.д. вибирати бої ретельно.

Сподіваюсь, це допомагає.


Ну, головним питанням, що впливає на все це, є той факт, що до публікації завантажених файлів немає модерації. намагання вгадати, чи є файл злом, а лише на основі його розширення - це завжди погана ідея. теоретично немає проблем із дозволом адміністраторів усіх завантажень, тому хоча деякі із запропонованих виправлень можуть бути загалом занадто широкими, на практиці вони можуть бути досить хорошими для багатьох людей. Бічна примітка IMHO SVG - це стільки ж зображення, скільки PDF, технічно це не так.
Марк Каплун

той, хто придумав типи mime, не погоджується з вами, як і постачальники браузерів та виробники програмного забезпечення у всьому світі. WordPress перевіряє лише розширення, тому що це не розроблено як мережева безпека, і це нормально (з тієї ж причини, Microsoft Office не паркує ваш автомобіль). Принаймні, гіперболічно сказати, що WP повинна робити набагато більше перевірок, ніж поверхнева, але я погоджуюся, що для цього потрібно зробити більше безпеки, тільки не те, що WP є відповідним засобом для цієї роботи (вона майже занадто велика, як є)
MrMesees

насправді браузери перевіряють вміст у будь-яких ситуаціях developer.mozilla.org/en-US/docs/Mozilla/…, і вони ніколи не дивляться на розширення. І так, ніхто не очікує, що в цей момент Wordpress зосередиться на посиленні безпеки;)
Марк Каплун

По-перше, одна стаття блогу одного браузера! = Всі браузери. Я знаю, Chrome приділяє увагу mime. По-друге, самоаналіз файлів дотримується правил; це не вільна форма, як підказує вільна мова. Більш всеосяжна валідація торгує продуктивністю для гнучкості (вона працює на клієнтах одного рівня ПК, а не на публічних пропозиціях для багатьох користувачів). Щоб підтвердити цей відкритий Firefox, відкрийте 100 вкладок, щоб переглянути пам'ять та використання процесора. Спробуйте те ж саме зі 100 запитами на веб-сайт! Останнє, будь ласка, зупиніться, якщо у вас є якісь фактичні факти, щоб додати не відступів. Це досить обтяжує і не приносить користі нікому.
MrMesees

огляд 256 перших байтів щойно завантаженого файлу призведе до майже нульового звернення до продуктивності, оскільки файл, ймовірно, знаходиться в пам'яті або SSD-кеші, і він зменшується в будь-якому випадку, коли ви порівнюєте його з хітом продуктивності, змінюючи розмір файлів, генеруючи мініатюру та що ні. Що стосується інших браузерів, не зовсім у тому ж кодовому потоці, але з цього сайту stackoverflow.com/questions/1201945/… не надумано вважати, що хром і Firefox дуже сильно вирівняні
Марк Каплун
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.