Pliki SVG nie zostały przesłane od ostatniej aktualizacji WP

16

Mam fragment funkcji w pliku PHP, który pozwala mi przesyłać pliki SVG. Od dzisiejszej aktualizacji do najnowszej wersji WP nie mogę już przesyłać plików svg. Próbowałem też drugiego fragmentu kodu ze strony sztuczek CSS i to też nie działa.

Czy ktoś wie a) co mogło być przyczyną ostatniej aktualizacji oraz b) Czy ktoś wie, jak to obejść.

Oto kod, którego zwykle używam:

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

Wielkie dzięki

Paweł.

Paul12_
źródło

Odpowiedzi:

16

W WordPress 4.7.1 wprowadzono zmianę, która sprawdza rzeczywisty typ MIME przesyłanego pliku. To zrywa przesyłanie typów plików, takich jak SVG lub DOCX. Istnieją już bilety na ten problem w WordPress Core, gdzie możesz przeczytać więcej na ten temat:

Tymczasowy i zalecane obejście (po raz, aż ten problem został rozwiązany) jest następujące wtyczki:
Disable rzeczywistym MIME Sprawdź

Jeśli nie chcesz używać tej wtyczki, oto ta sama funkcjonalność:

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

Zauważ, że ten wycinek zawiera kontrolę wersji, aby wyłączyć poprawkę, gdy tylko WordPress zostanie zaktualizowany.

Edytować

Problem został wstępnie ustawiony do rozwiązania w 4.7.2. Ale ponieważ 4.7.2 było pilną wersją zabezpieczeń , poprawka nie trafiła do tej wersji. Teraz ma to zostać naprawione w 4.7.3.

Gchtr
źródło
2
Alternatywne obejście dla środowisk programistycznych: dodaj define( 'ALLOW_UNFILTERED_UPLOADS', true );do wp-config.php. To nie jest bezpieczne do produkcji.
Tim Malone
1
Aby zebrać wszystkie informacje w jednym miejscu, oto pokrewny wątek na forum: wordpress.org/support/topic/wp-4-7-1-kills-svg
Tim Malone
Dzięki za to. W tej chwili nie jest to pilna sytuacja, ale dobrze jest wiedzieć, że jest coś do zrobienia. Bardzo mile widziane.
Paul12_
Wprowadza zbyt szeroki zakres efektów, chyba że sprawdza specjalnie 'svg' === strtolower($filetype['ext']);i wprowadza więcej pracy w przypadku, gdy praca nie jest potrzebna (głównie) lub plik nie jest typu svg ...
MrMesees
4

Wygląda na to, że to może być związane z tym biletem https://core.trac.wordpress.org/ticket/39552 , wygląda na coś, co popsuło się w 4.7.1

Mark Kaplun
źródło
Ach dzięki Mark. Myślałem, że coś jest nie tak. Mam nadzieję, że zostanie to wkrótce naprawione.
Paul12_
2

Wydaje się, że nikt nie pracował z tym, co jest, a szkoda, więc poradziłem sobie z tym ...

Historia / Tło

Stworzyłem program do przesyłania plików SVG w 2015 r. Na podstawie artykułu CSS-Tricks, w którym sprawdziłem, co było. Mam również siatkę działającą do podglądu obrazów i użyłem kilku innych poprawek. Prosta wtyczka (wtyczki typu pliku IMO powinny być proste)

Rozwiązanie

Wprowadzono kilka zmian w wersji 4.7. Prawdziwa PITA polegała na tym, że dla image/typów MIME WP używa teraz GD na obrazach. Aby to obejść, ustawiłem svgrozszerzenie, aby application/svg+xmlGD nie zadzierało z plikiem.

Aktualizacja: od 4.7.2 wybuchła pewna jasna iskra w niektórych przypadkach

Następnie za pomocą haka podłączamy go z powrotem do image/svg+xml. Jest to to samo, co używane w innych odpowiedziach, ale najpierw blokujemy go do naszego konkretnego przypadku, aby wyeliminować efekty (czy jest to plik SVG); możemy polegać na czytaniu $data['ext'](powinno być tańsze niż funkcja, aby uzyskać informacje o pliku jako tylko jedno porównanie i jeden dostęp do tablicy / skrótu).

Aktualizacja: od 4.7.2 $data['ext']nie zawsze jest ustawiona, więc teraz, jeśli jej długość wynosi <1 wyciąg (potencjalnie niebezpieczne) rozszerzenie z nazwy pliku przy użyciu strtolower(end(explode('.', $filename))). Powodem, dla którego tak naprawdę walczę za pomocą FileInfo jest to, że zasadniczo poleganie na rozszerzeniu PHP jest zbyt nieprzejrzyste i nie zawsze będzie działać dla wszystkich (szczególnie nie dla tych, które kompilują się bez dostępu lub bez dostępu, aby włączyć rozszerzenia, jeśli go nie ma). Chciałbym coś, co działa zamiast rozszerzenia. Nie jest już kwestia posiadania poprawnych informacji, więc dla osób ufających wyjściu FileInfoi posiadających rozszerzenie (uważam, że jest to domyślne w wersji 5.6+) powinno działać. Ponieważ jest to wtyczka, nie modyfikuje ona rdzenia, więc możesz wyłączyć ten kod lub wyrejestrować hak.

https://github.com/Lewiscowles1986/WordPressSVGPlugin

Widzieć

Inne obejścia

Zezwolenie na przesyłanie niefiltrowanych plików jest okropnym rozwiązaniem, ponieważ, jak powiedzieli inni, linkowanie do tego wątku, ludzie mogą przesyłać pliki php za pośrednictwem programu do przesyłania multimediów (to źle, a jeśli to zrobisz, powinieneś przestać i pomyśleć!)

Wymuszanie każdego pliku przez dowolną funkcję bez sprawdzania (jak na ironię, jeśli masz image/typ MIME, nie możesz po prostu mieć prostego sprawdzenia zewnętrznego). Może to potencjalnie stworzyć znacznie szersze efekty w celu rozwiązania stosunkowo niszowego problemu i wprowadza ogólnie więcej pracy (zastrzeżenie, że moja wtyczka wprowadza również więcej pracy dla administratorów, aby uzyskać interfejs administratora mediów do pracy)

Jeśli zostawimy mime jako application / svg + xml i po prostu przefiltrujemy typy mime, obraz zostanie przesłany, ale AFAIK wymaga poprawek do użycia jako wyróżnionego obrazu itp. Jest jeszcze wiele do zrobienia, aby zapewnić uniwersalne wrażenia SVG, więc wybrałem starannie dobierać bitwy.

Mam nadzieję że to pomoże.

MrMesees
źródło
Cóż, głównym problemem leżącym u podstaw tego wszystkiego jest brak moderacji przed opublikowaniem przesłanych plików. próba odgadnięcia, czy plik jest zła w zasadzie na podstawie jego rozszerzenia, jest zawsze złym pomysłem. teoretycznie nie ma problemu z zezwoleniem na przesyłanie wszystkich plików przez administratora, więc chociaż niektóre sugerowane poprawki mogą być ogólnie zbyt szerokie, w praktyce mogą być wystarczające dla wielu osób. Uwaga dodatkowa IMHO SVG jest tak samo obrazem jak plik PDF, technicznie nie jest.
Mark Kaplun,
ktokolwiek wymyślił typy MIME, nie zgadza się z tobą, podobnie jak producenci przeglądarek i producenci oprogramowania na całym świecie. WordPress sprawdza tylko rozszerzenia, ponieważ nie ma to na celu zapewnienia bezpieczeństwa sieci i jest w porządku (z tego samego powodu biuro Microsoft nie parkuje samochodu). Hiperboliczne jest przynajmniej stwierdzenie, że WP powinien wykonywać znacznie więcej kontroli niż powierzchownych, ale zgadzam się, że potrzeba więcej pracy w zakresie bezpieczeństwa, ale nie tylko, że WP jest odpowiednim narzędziem do tej pracy (jest prawie zbyt duża, jak jest)
MrMesees
w rzeczywistości przeglądarki sprawdzają zawartość we wszystkich sytuacjach developer.mozilla.org/en-US/docs/Mozilla/... i nigdy nie patrzą na rozszerzenie. I tak, nikt nie spodziewa się, że wordpress skupi się na
wzmocnieniu
Po pierwsze, jeden artykuł na blogu w jednej przeglądarce! = Wszystkie przeglądarki. Wiem, że Chrome zwraca uwagę na mime. Po drugie, introspekcja plików jest zgodna z regułami; nie jest to darmowa forma, jak sugeruje luźny język. Bardziej kompleksowa walidacja wymienia wydajność na elastyczność (działa na klientach na jednym komputerze, a nie na ofertach publicznych dla wielu użytkowników). Aby udowodnić, że Firefox jest otwarty, otwórz 100 kart na temat wykorzystania pamięci i procesora. Spróbuj tego samego ze 100 prośbami o stronę internetową! Ostatnią rzeczą, proszę przestań, chyba że masz jakieś faktyczne fakty, by nie dodać dygresji. Jest to dość irytujące i nie przynosi korzyści nikomu.
MrMesees,
sprawdzanie 256 pierwszych bajtów właśnie przesłanego pliku spowoduje prawie zerowe obniżenie wydajności, ponieważ plik prawdopodobnie znajduje się w pamięci podręcznej lub w pamięci podręcznej SSD, i blednie w każdym przypadku, gdy porównasz go z wydajnością wynikającą ze zmiany rozmiaru plików, wygenerowania miniatury i innych nie. Jeśli chodzi o inne przeglądarki, nie dokładnie w tym samym przepływie kodu, ale z tego stackoverflow.com/questions/1201945/... nie jest zbyt daleko
idące