Los archivos SVG no se cargan desde la última actualización de WP

16

Tengo un fragmento en mi archivo PHP de funciones que me permite cargar archivos SVG. Desde la actualización a la última versión de WP hoy, ya no puedo cargar svgs. También probé un segundo fragmento de código del sitio web de trucos CSS y tampoco funciona.

¿Alguien sabe a) qué pudo haber causado esto con la última actualización yb) ¿Alguien sabe una solución alternativa?

Aquí está el código que normalmente uso:

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

Muchas gracias

Pablo.

Paul12_
fuente

Respuestas:

16

En WordPress 4.7.1 se introdujo un cambio que verifica el tipo de mimo real de un archivo cargado. Esto interrumpe la carga de tipos de archivos como SVG o DOCX. Ya existen tickets para este problema en WordPress Core, donde puede leer más sobre esto:

Una solución temporal y recomendada (por el tiempo hasta que se solucione este problema) es el siguiente complemento:
Deshabilitar Verificación MIME real

Si no desea usar ese complemento, esta es la misma funcionalidad:

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

Tenga en cuenta que este recorte tiene una verificación de versión incluida para deshabilitar la corrección tan pronto como se actualice WordPress.

Editar

Inicialmente, el problema se resolvió en 4.7.2. Pero como 4.7.2 era una versión de seguridad urgente , la solución no llegó a esa versión. Ahora se supone que debe arreglarse en 4.7.3.

Gchtr
fuente
2
Solución alternativa para entornos de desarrollo: agregar define( 'ALLOW_UNFILTERED_UPLOADS', true );a wp-config.php. Esto no es seguro para la producción.
Tim Malone
1
Solo para recopilar toda la información en un solo lugar, aquí hay un hilo del foro relacionado: wordpress.org/support/topic/wp-4-7-1-kills-svg
Tim Malone
Gracias por esto. No es una situación urgente en este momento, pero es bueno saber que hay una solución alternativa. Muy apreciado.
Paul12_
Introduce efectos de rango demasiado amplio a menos que compruebe específicamente 'svg' === strtolower($filetype['ext']);e introduzca más trabajo en caso de que no se necesite trabajo (principalmente) o el archivo no sea del tipo svg ...
MrMesees
4

Parece que esto podría estar relacionado con este ticket https://core.trac.wordpress.org/ticket/39552 , parece que algo se rompió en 4.7.1

Mark Kaplun
fuente
Ah, gracias Mark. Pensé que algo andaba mal. Esperemos que se arregle pronto.
Paul12_
2

Nadie parece haber trabajado con lo que es y eso es una lástima, así que así es como lo manejé ...

Historia / antecedentes

Creé un cargador de SVG en 2015 basado en un artículo de CSS-Tricks que analizaba lo que era. También conseguí que la cuadrícula funcionara para la vista previa de la imagen, y usé algunas otras correcciones. Complemento simple (los complementos de tipo de archivo IMO deben ser simples)

Solución

Hubo algunos cambios para 4.7. El verdadero PITA era que para los image/tipos mime WP ahora está usando GD en las imágenes. Para omitir esto, configuré la svgextensión para usar application/svg+xmlpara que GD no se meta con el archivo.

Actualización: a partir de 4.7.2, una chispa brillante también se rompió en algunos casos

Luego, a través de un gancho, lo conectamos nuevamente image/svg+xml. Es el mismo que se usa en otras respuestas, pero primero lo bloqueamos a nuestro caso específico para eliminar los efectos (es un archivo SVG); podemos confiar en la lectura $data['ext'](debería ser más barato que la función para obtener información del archivo como solo una comparación y un acceso de matriz / hash).

Actualización: a partir de 4.7.2 $data['ext']no siempre se establece, por lo que ahora si su longitud es <1 extracción (potencialmente insegura) extensión del nombre de archivo usando strtolower(end(explode('.', $filename))). La razón por la que realmente estoy luchando con FileInfo es que, esencialmente, confiar en una extensión de PHP es demasiado opaco y no siempre funcionará para todos (especialmente para aquellos que compilan sin o sin acceso para habilitar extensiones si no está allí). Me gustaría algo que funcione en lugar de una extensión. Ya no se trata de tener la información correcta, por lo que para aquellos que confían en la salida FileInfoy tienen la extensión (creo que es predeterminada en 5.6+) debería funcionar. Además, debido a que es un complemento, no está modificando el núcleo, puede desactivar este código o anular el registro del gancho.

https://github.com/Lewiscowles1986/WordPressSVGPlugin

Ver

Otras soluciones

Permitir cargas no filtradas es una solución horrible porque, como otros han dicho, vincular a este hilo la gente podría subir archivos php a través del cargador de medios (eso es malo y si lo haces, ¡deberías detenerte y pensar!)

Forzar cada archivo a través de cualquier función sin controles (Irónicamente, si tiene image/el tipo mime, no puede tener un simple control de extensión). Esto tiene el potencial de crear efectos de alcance mucho más amplio para resolver un problema relativamente nicho e introduce más trabajo en general (advertencia mi plugin también introduce más trabajo para que los usuarios administradores obtengan la interfaz de usuario de medios de administración para trabajar)

Si dejáramos el mime como application / svg + xml y simplemente filtramos los tipos de mime, la imagen se cargaría, pero AFAIK requeriría soluciones para usarlas como imagen destacada, etc. para elegir batallas con cuidado.

Espero que esto ayude.

MrMesees
fuente
bueno, el problema central que impulsa todo esto es el hecho de que no hay moderación antes de que se publiquen los archivos cargados. Tratar de adivinar si un archivo es malo básicamente solo por su extensión es siempre una mala idea. en teoría no hay ningún problema con permitir todas las cargas por parte del administrador, por lo que, aunque algunas de las soluciones sugeridas pueden ser demasiado amplias, en la práctica pueden ser lo suficientemente buenas para muchas personas. Nota al margen IMHO SVG es tanto una imagen como un PDF, técnicamente no lo es.
Mark Kaplun
quienquiera que haya creado mime-types no está de acuerdo con usted, al igual que los proveedores de navegadores y los productores de software de todo el mundo. WordPress solo verifica las extensiones porque no está pensado como una pieza de seguridad de red y está bien (por la misma razón que Microsoft Office no estaciona su automóvil). Es hiperbólico al menos decir que WP debería hacer mucho más control que superficial, pero estoy de acuerdo en que debe haber más trabajo de seguridad, pero no es que WP sea un vehículo apropiado para ese trabajo (es casi demasiado grande como está)
MrMesees
en realidad, los navegadores inspeccionan el contenido en todo tipo de situaciones developer.mozilla.org/en-US/docs/Mozilla/… y nunca miran la extensión. Y sí, nadie espera que WordPress en este punto se centre en fortalecer la seguridad;)
Mark Kaplun
Lo primero, un artículo de blog de un navegador! = Todos los navegadores. Sé que Chrome presta atención al mimo. En segundo lugar, la introspección de archivos sigue reglas; no es de forma libre como sugiere el lenguaje laxo. La validación más completa cambia el rendimiento por flexibilidad (funciona en clientes de nivel de PC único, no en ofertas públicas de múltiples usuarios). Para probar esto, abre Firefox, abre 100 pestañas para ver el uso de memoria y CPU. ¡Pruebe lo mismo con 100 solicitudes de un sitio web! Lo último, deténgase a menos que tenga algunos hechos reales para agregar, no digresiones. Es bastante agravante y no beneficia a nadie.
MrMesees
inspeccionar los 256 primeros bytes de un archivo recién cargado tendrá un impacto de rendimiento casi nulo, ya que el archivo probablemente esté en la memoria o en la caché SSD, y en cualquier caso palidece cuando lo compara con el impacto de rendimiento al cambiar el tamaño de los archivos, generando miniaturas y qué no. En cuanto a otros navegadores, no exactamente en el mismo flujo de código, pero desde este stackoverflow.com/questions/1201945/… no es descabellado suponer que Chrome y Firefox están muy alineados
Mark Kaplun