Các tệp SVG không tải lên kể từ khi cập nhật WP gần đây nhất


16

Tôi có một đoạn mã trong tệp PHP chức năng của mình cho phép tôi tải lên các tệp SVG. Kể từ khi nâng cấp lên phiên bản WP mới nhất hiện nay, tôi không còn có thể tải lên Svss nữa. Tôi cũng đã thử một đoạn mã thứ hai từ trang web thủ thuật CSS và nó cũng không hoạt động.

Có ai biết a) những gì có thể đã gây ra điều này với bản cập nhật cuối cùng và b) Có ai biết một tác phẩm xung quanh không.

Đây là mã tôi thường sử dụng:

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

Cảm ơn nhiều

Paul.

Câu trả lời:


16

Trong WordPress 4.7.1, một thay đổi đã được giới thiệu để kiểm tra loại mime thực của tệp được tải lên. Điều này phá vỡ việc tải lên các loại tệp như SVG hoặc DOCX. Hiện đã có vé cho vấn đề này trong WordPress Core, nơi bạn có thể đọc thêm về điều này:

Một tạm workaround và đề nghị (đối với thời gian cho đến khi vấn đề này được cố định) là các plugin sau:
Disable Bất MIME Kiểm tra

Nếu bạn không muốn sử dụng plugin đó, thì đây là chức năng tương tự:

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

Lưu ý rằng snipped này có kiểm tra phiên bản đi kèm để vô hiệu hóa sửa chữa ngay khi WordPress được cập nhật.

Biên tập

Vấn đề ban đầu được đặt ra để khắc phục trong 4.7.2. Nhưng vì 4.7.2 là một bản phát hành bảo mật khẩn cấp , bản sửa lỗi đã không được đưa vào phiên bản đó. Bây giờ nó được cho là đã được sửa trong 4.7.3.


2
Giải pháp thay thế cho môi trường phát triển: thêm define( 'ALLOW_UNFILTERED_UPLOADS', true );vào wp-config.php. Điều này không an toàn cho sản xuất.
Tim Malone

1
Chỉ để thu thập tất cả thông tin ở một nơi, đây cũng là một chủ đề của diễn đàn có liên quan: wordpress.org/support/topic/wp-4-7-1-kills-svg
Tim Malone

Cảm ơn vì điều đó. Hiện tại nó không phải là một tình huống khẩn cấp, nhưng thật tốt khi biết có một công việc xung quanh. Rất nhiều đánh giá cao.
Paul12_

Giới thiệu các hiệu ứng phạm vi quá rộng trừ khi nó kiểm tra cụ thể 'svg' === strtolower($filetype['ext']);và giới thiệu nhiều công việc hơn trong trường hợp không cần làm việc (hầu hết) hoặc tệp không phải là loại
Svg


2

Dường như không ai chỉ làm việc với những gì và điều đó quá tệ nên đây là cách tôi xử lý ...

Lịch sử / Bối cảnh

Tôi đã tạo một trình tải lên SVG vào năm 2015 dựa trên bài viết CSS-Tricks xem xét những gì đã được. Tôi cũng có lưới làm việc để xem trước hình ảnh và sử dụng một vài sửa chữa khác. Plugin đơn giản (plugin kiểu tệp IMO nên đơn giản)

Giải pháp

Có một vài thay đổi cho 4.7. PITA thực sự là đối với image/các loại mime WP hiện đang sử dụng GD trên hình ảnh. Để bỏ qua điều này, tôi đặt svgtiện ích mở rộng để sử dụng application/svg+xmlđể GD không gây rối với tệp.

Cập nhật: kể từ 4.7.2, một số tia sáng đã phá vỡ điều đó trong một số trường hợp

Sau đó, qua hook chúng tôi hotwire nó trở lại image/svg+xml. Nó được sử dụng tương tự trong các câu trả lời khác, nhưng trước tiên chúng tôi khóa nó vào trường hợp cụ thể của chúng tôi để loại bỏ các hiệu ứng (có phải là tệp SVG); chúng ta có thể dựa vào việc đọc $data['ext'](nên rẻ hơn hàm để lấy thông tin tệp chỉ là một so sánh và một truy cập mảng / băm).

Cập nhật: kể từ 4.7.2 $data['ext']không phải lúc nào cũng được đặt, vì vậy chúng tôi bây giờ nếu độ dài của nó là phần mở rộng <1 trích xuất (có khả năng không an toàn) từ tên tệp sử dụng strtolower(end(explode('.', $filename))). Lý do tôi thực sự chiến đấu khi sử dụng FileInfo là về cơ bản dựa vào tiện ích mở rộng PHP quá mờ và sẽ không luôn hoạt động cho mọi người (đặc biệt là những người biên dịch không có hoặc không có quyền truy cập để bật tiện ích mở rộng nếu không có). Tôi muốn một cái gì đó hoạt động thay cho một phần mở rộng. Nó không còn là vấn đề có thông tin chính xác vì vậy đối với những người tin tưởng đầu ra FileInfovà có phần mở rộng (tôi tin rằng nó được mặc định trong 5.6+) thì nó sẽ hoạt động. Ngoài ra, vì đây là một plugin, nó không sửa đổi lõi, bạn có thể tắt mã này hoặc hủy đăng ký hook.

https://github.com/Lewiscowles1986/WordPressSVGPlugin

Xem

Cách giải quyết khác

Cho phép tải lên không được lọc là một giải pháp khủng khiếp vì như những người khác đã nói liên kết đến chủ đề này, mọi người có thể tải lên các tệp php thông qua trình tải lên phương tiện (điều đó thật tệ và nếu bạn làm điều đó, bạn nên dừng lại và suy nghĩ!)

Buộc mọi tệp thông qua bất kỳ chức năng nào mà không cần kiểm tra (Trớ trêu thay nếu bạn có image/loại mime, bạn không thể có một kiểm tra mở rộng đơn giản). Điều này có khả năng tạo ra các hiệu ứng tiếp cận rộng hơn để giải quyết một vấn đề tương đối thích hợp và giới thiệu nhiều công việc hơn (nói chung, plugin của tôi cũng giới thiệu nhiều công việc hơn cho người dùng quản trị để giao diện người dùng quản trị phương tiện hoạt động)

Nếu chúng tôi để lại mime dưới dạng ứng dụng / svg + xml và chỉ lọc các loại mime mà hình ảnh sẽ tải lên nhưng AFAIK sẽ yêu cầu sửa lỗi để được sử dụng làm hình ảnh nổi bật, v.v. để chọn các trận chiến một cách cẩn thận.

Hi vọng điêu nay co ich.


tốt, vấn đề cốt lõi thúc đẩy toàn bộ điều này là thực tế là không có kiểm duyệt trước khi các tệp được tải lên được xuất bản. cố gắng đoán xem một tập tin là xấu về cơ bản chỉ dựa trên phần mở rộng của nó luôn là một ý tưởng tồi. về mặt lý thuyết, không có vấn đề gì với việc cho phép tất cả các video tải lên bởi quản trị viên, vì vậy trong khi một số bản sửa lỗi được đề xuất có thể quá rộng, trong thực tế, chúng có thể đủ tốt cho nhiều người. Lưu ý phụ IMHO SVG giống như một hình ảnh PDF, về mặt kỹ thuật thì không.
Đánh dấu Kaplun

bất cứ ai nghĩ ra các loại mime đều không đồng ý với bạn, cũng như các nhà cung cấp trình duyệt và nhà sản xuất phần mềm trên toàn thế giới. WordPress chỉ kiểm tra các tiện ích mở rộng vì nó không nhằm mục đích bảo mật mạng và điều đó không sao (vì lý do tương tự văn phòng microsoft không đỗ xe của bạn). Ít nhất là cường điệu khi nói WP nên kiểm tra nhiều hơn so với bề ngoài nhưng tôi đồng ý rằng cần phải có nhiều công việc bảo mật hơn, chỉ là WP không phải là phương tiện thích hợp cho công việc đó (nó gần như quá lớn)
MrMesees

trên thực tế các trình duyệt kiểm tra nội dung trong tất cả các loại tình huống developer.mozilla.org/en-US/docs/Mozilla/ mẹo và họ không bao giờ nhìn vào phần mở rộng. Và vâng, không ai mong đợi wordpress vào thời điểm này sẽ tập trung vào việc tăng cường bảo mật;)
Mark Kaplun

Điều đầu tiên, một bài viết blog của một trình duyệt! = Tất cả các trình duyệt. Tôi biết Chrome chú ý đến mime. Điều thứ hai, nội tâm của các tập tin tuân theo các quy tắc; nó không phải là hình thức miễn phí như ngôn ngữ lỏng lẻo gợi ý. Xác nhận toàn diện hơn giao dịch hiệu suất cho tính linh hoạt (nó hoạt động trên các máy khách cấp PC duy nhất, không phải dịch vụ công cộng nhiều người dùng). Để chứng minh điều này mở Firefox, hãy mở 100 tab xem bộ nhớ và mức sử dụng CPU. Hãy thử tương tự với 100 yêu cầu cho một trang web! Điều cuối cùng xin vui lòng dừng lại trừ khi bạn có một số sự kiện thực tế để thêm không lạc đề. Nó khá trầm trọng và không mang lại lợi ích cho ai.
MrMesees

Việc kiểm tra 256 byte đầu tiên của tệp vừa tải lên sẽ đạt hiệu suất gần như bằng 0 vì tệp có thể nằm trong bộ nhớ hoặc bộ nhớ cache của SSD và trong mọi trường hợp khi bạn so sánh nó với hiệu năng đạt được từ việc thay đổi kích thước tệp, tạo hình thu nhỏ và những gì không phải. Đối với các trình duyệt khác, không chính xác trong cùng một dòng mã, nhưng từ stackoverflow.com/questions/1201945/ này, sẽ không quá xa khi cho rằng chrome và firefox được căn chỉnh rất nhiều
Mark Kaplun
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.