File SVG tidak diunggah sejak pembaruan WP terbaru

16

Saya memiliki potongan di file PHP fungsi saya yang memungkinkan saya untuk mengunggah file SVG. Sejak memutakhirkan ke versi WP terbaru hari ini, saya tidak bisa lagi mengunggah svgs. Saya juga mencoba cuplikan kode kedua dari situs web trik CSS dan itu juga tidak berhasil.

Adakah yang tahu a) apa yang menyebabkan ini dengan pembaruan terakhir dan b) Adakah yang tahu cara mengatasinya.

Berikut adalah kode yang biasanya saya gunakan:

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

Terimakasih banyak

Paul.

Paul12_
sumber

Jawaban:

16

Di WordPress 4.7.1 perubahan diperkenalkan yang memeriksa tipe pantomim asli dari file yang diunggah. Ini memecah mengunggah jenis file seperti SVG atau DOCX. Sudah ada tiket untuk masalah ini di WordPress Core, di mana Anda dapat membaca lebih lanjut tentang ini:

Solusi sementara dan yang direkomendasikan (untuk waktu sampai masalah ini diperbaiki) adalah plugin berikut:
Nonaktifkan Real MIME Check

Jika Anda tidak ingin menggunakan plugin itu, ini fungsinya sama:

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

Perhatikan bahwa potongan ini memiliki versi cek yang disertakan untuk menonaktifkan perbaikan segera setelah WordPress diperbarui.

Edit

Masalah ini awalnya ditetapkan untuk diperbaiki di 4.7.2. Tetapi karena 4.7.2 adalah rilis keamanan yang mendesak , perbaikannya tidak membuatnya menjadi versi itu. Sekarang seharusnya diperbaiki di 4.7.3.

Gchtr
sumber
2
Solusi alternatif untuk lingkungan pengembangan: tambahkan define( 'ALLOW_UNFILTERED_UPLOADS', true );ke wp-config.php. Ini tidak aman untuk produksi.
Tim Malone
1
Hanya untuk mengumpulkan semua info di satu tempat, berikut utas forum terkait juga: wordpress.org/support/topic/wp-4-7-1-kills-svg
Tim Malone
Terima kasih untuk ini. Ini bukan situasi yang mendesak saat ini, tetapi senang mengetahui ada pekerjaan di sekitar. Sangat dihargai.
Paul12_
Memperkenalkan efek 'svg' === strtolower($filetype['ext']);rentang terlalu luas kecuali memeriksa khusus untuk dan memperkenalkan lebih banyak pekerjaan jika tidak diperlukan pekerjaan (kebanyakan) atau file tersebut bukan dari tipe svg ...
MrMesees
4

Sepertinya ini terkait dengan tiket ini https://core.trac.wordpress.org/ticket/39552 , sepertinya ada sesuatu yang rusak di 4.7.1

Mark Kaplun
sumber
Ah, terima kasih, Mark. Saya pikir ada sesuatu yang salah. Semoga akan segera diperbaiki.
Paul12_
2

Sepertinya tidak ada yang baru saja bekerja dengan apa yang ada dan itu sangat buruk jadi inilah cara saya menangani ...

Sejarah / Latar Belakang

Saya membuat pengunggah SVG pada tahun 2015 berdasarkan artikel Trik-CSS melihat apa itu. Saya juga dapat kisi-kisi untuk pratinjau gambar, dan menggunakan beberapa perbaikan lainnya. Plugin sederhana (plugin jenis file IMO harus sederhana)

Larutan

Ada beberapa perubahan untuk 4.7. PITA yang sebenarnya adalah bahwa untuk image/jenis pantomim WP sekarang menggunakan GD pada gambar. Untuk memotong ini saya mengatur svgekstensi untuk digunakan application/svg+xmlsehingga GD tidak akan mengacaukan file.

Pembaruan: pada 4.7.2 beberapa percikan terang pecah juga dalam beberapa kasus

Kemudian nanti melalui kait kami hotwire kembali ke image/svg+xml. Ini sama dengan yang digunakan pada jawaban lain, tetapi kami pertama-tama menguncinya ke kasus khusus kami untuk menghilangkan efek (apakah ini file SVG); kita bisa mengandalkan membaca $data['ext'](harus lebih murah daripada fungsinya untuk mendapatkan info file karena hanya satu perbandingan dan satu akses array / hash).

Pembaruan: pada 4.7.2 $data['ext']tidak selalu diatur, jadi kami sekarang jika panjangnya <1 mengekstrak ekstensi (berpotensi tidak aman) dari nama file yang digunakan strtolower(end(explode('.', $filename))). Alasan saya benar-benar berjuang menggunakan FileInfo adalah bahwa pada dasarnya mengandalkan ekstensi PHP terlalu buram dan tidak akan selalu bekerja untuk semua orang (terutama yang tidak mengkompilasi tanpa atau tanpa akses untuk mengaktifkan ekstensi jika tidak ada di sana). Saya ingin sesuatu yang berfungsi sebagai pengganti ekstensi. Ini bukan lagi masalah memiliki informasi yang benar sehingga bagi mereka yang mempercayai hasil dari FileInfodan memiliki ekstensi (saya percaya itu default di 5.6+) itu harus berfungsi. Juga karena ini adalah plugin, itu bukan memodifikasi inti Anda dapat mematikan kode ini atau membatalkan registrasi kail.

https://github.com/Lewiscowles1986/WordPressSVGPlugin

Lihat

Penanganan lainnya

Mengizinkan pengunggahan tanpa filter adalah solusi yang mengerikan karena seperti yang dikatakan orang lain menghubungkan ke utas ini orang dapat mengunggah file php melalui pengunggah media (itu buruk dan jika Anda melakukannya, Anda harus berhenti dan berpikir!)

Memaksa setiap file melalui fungsi apa pun tanpa pemeriksaan (Ironisnya jika Anda memiliki image/tipe mime, Anda tidak bisa hanya memiliki pemeriksaan ekst yang sederhana). Ini memiliki potensi untuk menciptakan efek jangkauan yang jauh lebih luas untuk memecahkan masalah yang relatif niche dan memperkenalkan lebih banyak pekerjaan secara keseluruhan (peringatan plugin saya juga memperkenalkan lebih banyak pekerjaan bagi pengguna admin untuk membuat media admin UI bekerja)

Jika kita meninggalkan mime sebagai aplikasi / svg + xml dan cukup memfilter jenis mime gambar akan diunggah tetapi AFAIK akan memerlukan perbaikan untuk digunakan sebagai gambar unggulan dll. Ada lebih banyak pekerjaan yang harus dilakukan untuk memastikan pengalaman universal SVG jadi saya memilih untuk memilih pertempuran dengan hati-hati.

Semoga ini membantu.

MrMesees
sumber
baik, masalah inti yang menggerakkan semua ini adalah kenyataan bahwa tidak ada moderasi sebelum file yang diunggah dipublikasikan. mencoba menebak apakah suatu file jahat pada dasarnya hanya berdasarkan pada ekstensi selalu merupakan ide yang buruk. secara teori tidak ada masalah dengan mengizinkan semua unggahan oleh admin jadi sementara beberapa perbaikan yang disarankan mungkin terlalu luas, dalam praktiknya mungkin cukup baik untuk banyak orang. Catatan samping IMHO SVG adalah sebanyak gambar sebagai PDF, secara teknis tidak.
Mark Kaplun
siapa pun yang datang dengan tipe pantomim tidak setuju dengan Anda, seperti halnya vendor browser dan produsen perangkat lunak di seluruh dunia. WordPress hanya memeriksa ekstensi karena itu tidak dimaksudkan sebagai bagian dari keamanan jaringan dan tidak apa-apa (untuk alasan yang sama microsoft office tidak memarkir mobil Anda). Ini hiperbolik setidaknya untuk mengatakan WP harus melakukan lebih banyak pengecekan daripada dangkal tapi saya setuju perlu ada lebih banyak pekerjaan keamanan, hanya saja WP tidak merupakan kendaraan yang sesuai untuk pekerjaan itu (ini hampir terlalu besar)
MrMesees
sebenarnya browser melakukan pemeriksaan konten dalam semua jenis situasi developer.mozilla.org/en-US/docs/Mozilla/… dan mereka tidak pernah melihat ekstensi. Dan ya tidak ada yang mengharapkan wordpress pada titik ini untuk memiliki fokus pada pengerasan keamanan;)
Mark Kaplun
Hal pertama, satu artikel blog dari satu browser! = Semua browser. Saya Tahu Chrome memperhatikan pantomim. Hal kedua, introspeksi file mengikuti aturan; itu bukan bentuk bebas seperti bahasa longgar menyarankan. Validasi yang lebih komprehensif memperdagangkan kinerja untuk fleksibilitas (ini berfungsi pada klien tingkat PC tunggal, bukan penawaran publik multi-pengguna). Untuk membuktikan Firefox yang terbuka ini, buka 100 tab lihat penggunaan memori & CPU. Coba hal yang sama dengan 100 permintaan untuk situs web! Hal terakhir harap berhenti kecuali Anda memiliki fakta aktual untuk ditambahkan bukan penyimpangan. Ini cukup menjengkelkan dan tidak menguntungkan siapa pun.
MrMesees
memeriksa 256 byte pertama dari file yang baru saja diunggah akan menghasilkan hampir nol hit kinerja karena file mungkin dalam memori atau cache SSD, dan artinya jika Anda membandingkannya dengan hit kinerja dari mengubah ukuran file, menghasilkan thumbnail dan apa tidak. Adapun peramban lain, tidak persis dalam aliran kode yang sama, tetapi dari stackoverflow.com/questions/1201945/... ini tidak masuk akal untuk mengasumsikan bahwa chrome dan firefox sangat selaras
Mark Kaplun