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.
define( 'ALLOW_UNFILTERED_UPLOADS', true );
dowp-config.php
. To nie jest bezpieczne do produkcji.'svg' === strtolower($filetype['ext']);
i wprowadza więcej pracy w przypadku, gdy praca nie jest potrzebna (głównie) lub plik nie jest typu svg ...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
źródło
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łemsvg
rozszerzenie, abyapplication/svg+xml
GD 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życiustrtolower(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ściuFileInfo
i 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.
źródło