Fichiers non téléchargés depuis la dernière mise à jour de WP

16

J'ai dans mes fonctions un extrait de code PHP qui me permet de télécharger des fichiers SVG. Depuis la mise à niveau vers la dernière version de WP aujourd'hui, je ne peux plus télécharger de svgs. J'ai également essayé un deuxième extrait de code du site Web CSS Tricks et cela ne fonctionne pas non plus.

Est-ce que quelqu'un sait a) quelle en est la cause dans la dernière mise à jour et b) Quelqu'un connaît-il un moyen de contourner le problème?

Voici le code que j'utilise normalement:

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

Merci beaucoup

Paul.

    
posée Paul12_ 11.01.2017 - 22:16

3 réponses

16

Dans WordPress 4.7.1, une modification apportée vérifie le type de mime réel d'un fichier téléchargé. Cela interrompt le téléchargement de types de fichiers tels que SVG ou DOCX. Il existe déjà des tickets pour ce problème dans WordPress Core, où vous pouvez en savoir plus à ce sujet:

  • Le téléchargement de certains fichiers non-image échoue après la version 4.7.1 ( enlace )
  • Prise en charge de l'envoi de fichiers SVG interrompue dans la version 4.7.1 ( enlace )

Une solution temporaire et recommandée (jusqu'à ce que ce problème soit résolu) est le plug-in suivant:
Désactiver la vérification MIME réelle

Si vous ne souhaitez pas utiliser ce plugin, voici la même fonctionnalité:

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

Notez que dans cette copie, une vérification de version est incluse pour désactiver le correctif dès la mise à jour de WordPress.

Modifier

Le problème devait initialement être résolu dans 4.7.2. Mais comme 4.7.2 était une mise à jour de sécurité urgente , le correctif ne l'a pas fait dans cette version. Il est maintenant supposé être corrigé en 4.7.3.

    
réponse donnée Gchtr 12.01.2017 - 19:51
5

On dirait que cela pourrait être lié à ce ticket enlace , qui ressemble à quelque chose qui a été cassé dans 4.7.1

    
réponse donnée Mark Kaplun 12.01.2017 - 02:16
2

Personne ne semble avoir juste travaillé avec ce qui est et c'est dommage, alors voici comment j'ai géré ...

Historique / Contexte

J'ai créé un programme de téléchargement SVG en 2015 basé sur un article de CSS-Tricks analysant ce qui était. J'ai également eu la grille de travail pour l'aperçu de l'image, et utilisé quelques autres corrections. Plugin simple (les plugins de type fichier IMO doivent être simples)

Solution

Il y a eu quelques changements pour 4.7. Le véritable PITA était que, pour les types image/ mime, WP utilise maintenant GD sur les images. Pour éviter cela, je règle l'extension svg de manière à utiliser application/svg+xml afin que GD ne joue pas avec le fichier.

Mise à jour: à partir de la version 4.7.2, une étincelle brillante s'est également brisée dans certains cas

Ensuite, via hook, nous le renvoyons à image/svg+xml . C'est la même chose que dans d'autres réponses, mais nous le verrons d'abord dans notre cas spécifique pour éliminer les effets (s'agit-il d'un fichier SVG); nous pouvons nous fier à la lecture de $data['ext'] (devrait être meilleur marché que la fonction pour obtenir les informations sur le fichier sous la forme d’une seule comparaison et d’un seul accès tableau / hachage).

Mise à jour: à partir de la version 4.7.2 $data['ext'] n'est pas toujours défini. Par conséquent, sa longueur est maintenant < 1 extrait (potentiellement non sécurisé) extension du nom de fichier en utilisant strtolower(end(explode('.', $filename))) . La raison pour laquelle je me bats vraiment avec FileInfo est que le fait de s’appuyer sur une extension PHP est trop opaque et ne fonctionnera pas toujours pour tout le monde (surtout si vous compilez sans ou sans accès pour activer des extensions s’il n’y en a pas). Je voudrais quelque chose qui fonctionne à la place d'une extension. Ce n'est plus une question d'avoir les informations correctes, donc pour ceux qui font confiance à la sortie de FileInfo et qui ont l'extension (je crois que c'est la valeur par défaut de 5.6 +), cela devrait fonctionner. De plus, comme il s’agit d’un plugin, il n’est pas possible de modifier le noyau, vous pouvez désactiver ce code ou annuler l’enregistrement du hook.

enlace

Voir

Autres solutions de contournement

Autoriser les chargements non filtrés est une solution horrible car, comme d'autres l'ont déjà dit, les gens pourraient télécharger des fichiers php via un outil de téléchargement de média (c'est mauvais et si vous le faites, vous devriez vous arrêter et réfléchir!)

Forcer chaque fichier à travers une fonction sans vérification (Ironiquement, si vous avez image/ dans le type mime, vous ne pouvez pas effectuer une simple vérification ext). Cela a le potentiel de créer des effets d'une portée beaucoup plus large pour résoudre un problème relativement créneau et introduit plus de travail dans l'ensemble (caveat my plugin introduit également plus de travail pour les utilisateurs admin afin de faire fonctionner l'interface utilisateur de média d'administrateur).

Si nous laissions le mime sous le nom application / svg + xml et que nous filtrions simplement les types de mime que l'image serait téléchargée, mais AFAIK exigerait que des correctifs soient utilisés comme image sélectionnée, etc. Il reste encore beaucoup à faire pour garantir une expérience SVG universelle j'ai donc choisi de choisir soigneusement les batailles.

J'espère que cela vous aidera.

    
réponse donnée MrMesees 19.01.2017 - 17:50

Lire d'autres questions sur les étiquettes