Les fichiers SVG ne se téléchargent pas depuis la dernière mise à jour WP

16

J'ai un extrait dans mon fichier PHP de fonctions 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 des astuces CSS et cela ne fonctionne pas non plus.

Est-ce que quelqu'un sait a) ce qui a pu causer cela avec la dernière mise à jour et b) Quelqu'un connaît-il une solution?

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.

Paul12_
la source

Réponses:

16

Dans WordPress 4.7.1, un changement a été introduit qui vérifie le type 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:

Une solution de contournement temporaire et recommandée (pour le temps jusqu'à ce que ce problème soit résolu) est le plugin suivant:
Désactiver Real MIME Check

Si vous ne souhaitez pas utiliser ce plugin, voici les mêmes fonctionnalités:

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 cette capture a une vérification de version incluse pour désactiver le correctif dès que WordPress est mis à jour.

Éditer

Le problème devait initialement être résolu dans 4.7.2. Mais comme 4.7.2 était une version de sécurité urgente , le correctif n'a pas été intégré dans cette version. Il est maintenant censé être corrigé dans 4.7.3.

Gchtr
la source
2
Solution alternative pour les environnements de développement: ajouter define( 'ALLOW_UNFILTERED_UPLOADS', true );à wp-config.php. Ce n'est pas sûr pour la production.
Tim Malone
1
Juste pour collecter toutes les informations en un seul endroit, voici également un fil de discussion connexe: wordpress.org/support/topic/wp-4-7-1-kills-svg
Tim Malone
Merci pour cela. Ce n'est pas une situation urgente pour le moment, mais il est bon de savoir qu'il y a un travail à faire. Très apprécié.
Paul12_
Introduit des effets trop étendus à moins qu'il ne vérifie spécifiquement 'svg' === strtolower($filetype['ext']);et n'introduise plus de travail dans le cas où aucun travail n'est nécessaire (principalement) ou si le fichier n'est pas de type svg ...
MrMesees
4

Il semble que cela puisse être lié à ce ticket https://core.trac.wordpress.org/ticket/39552 , ressemble à quelque chose qui s'est cassé en 4.7.1

Mark Kaplun
la source
Ah merci Mark. Je pensais que quelque chose n'allait pas. Espérons que ce sera bientôt corrigé.
Paul12_
2

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

Histoire / Contexte

J'ai créé un uploader SVG en 2015 basé sur un article CSS-Tricks regardant ce qui était. J'ai également fait fonctionner la grille pour la prévisualisation d'image et j'ai utilisé quelques autres correctifs. Plugin simple (les plugins de type fichier IMO doivent être simples)

Solution

Il y a eu quelques changements pour 4.7. Le vrai PITA était que pour les image/types MIME, WP utilise maintenant GD sur les images. Pour contourner cela, j'ai défini l' svgextension à utiliser application/svg+xmlpour que GD ne joue pas avec le fichier.

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

Puis, plus tard, via un crochet, nous le réinscrivons à chaud image/svg+xml. C'est la même chose utilisée dans d'autres réponses, mais nous le verrons d'abord dans notre cas spécifique pour éliminer les effets (est-ce un fichier SVG); nous pouvons compter sur la lecture $data['ext'](devrait être moins cher que la fonction pour obtenir des informations sur les fichiers comme une seule comparaison et un accès tableau / hachage).

Mise à jour: à partir de 4.7.2 $data['ext']n'est pas toujours définie, nous allons donc maintenant si sa longueur est <1 extraire (potentiellement dangereux) l'extension du nom de fichier en utilisant strtolower(end(explode('.', $filename))). La raison pour laquelle je me bats vraiment en utilisant FileInfo est que s'appuyer essentiellement sur une extension PHP est trop opaque et ne fonctionnera pas toujours pour tout le monde (en particulier pas ceux qui compilent sans ou sans accès pour activer les extensions s'il n'y en a pas). J'aimerais quelque chose qui fonctionne au lieu d'une extension. Il ne s'agit plus d'avoir les informations correctes, donc pour ceux qui font confiance à la sortie de FileInfoet ayant l'extension (je pense que c'est la valeur par défaut en 5.6+), cela devrait fonctionner. De plus, comme il s'agit d'un plugin, il ne modifie pas le noyau, vous pouvez désactiver ce code ou désinscrire le hook.

https://github.com/Lewiscowles1986/WordPressSVGPlugin

Voir

Autres solutions de contournement

Autoriser les téléchargements non filtrés est une solution horrible car, comme d'autres l'ont dit, un lien vers ce fil de discussion pourrait permettre aux gens de télécharger des fichiers php via le téléchargement de médias (c'est mauvais et si vous le faites, vous devriez vous arrêter et réfléchir!)

Forcer chaque fichier à travers n'importe quelle fonction sans vérification (Ironiquement, si vous avez image/dans le type mime, vous ne pouvez pas simplement avoir une simple vérification d'ext). Cela a le potentiel de créer des effets d'une portée beaucoup plus large pour résoudre un problème relativement de niche et introduit plus de travail dans l'ensemble (avertir mon plugin introduit également plus de travail pour les utilisateurs administrateurs pour que l'interface utilisateur des médias d'administration fonctionne)

Si nous quittions le mime en tant qu'application / svg + xml et filtrions simplement les types de mime que l'image téléchargerait, mais AFAIK exigerait-il que des correctifs soient utilisés comme image en vedette, etc. Il y a plus de travail à faire pour assurer une expérience SVG universelle, alors j'ai choisi pour choisir les batailles avec soin.

J'espère que cela t'aides.

MrMesees
la source
eh bien, le principal problème à l'origine de tout cela est le fait qu'il n'y a pas de modération avant la publication des fichiers téléchargés. essayer de deviner si un fichier est mal simplement basé sur son extension est toujours une mauvaise idée. en théorie, il n'y a aucun problème à autoriser tous les téléchargements par l'administrateur, alors même si certains des correctifs suggérés peuvent être généralement trop larges, en pratique, ils peuvent être assez bons pour de nombreuses personnes. Note latérale IMHO SVG est autant une image qu'un PDF, techniquement non.
Mark Kaplun
quiconque a proposé des types mime n'est pas d'accord avec vous, tout comme les fournisseurs de navigateurs et les éditeurs de logiciels du monde entier. WordPress ne vérifie que les extensions car il n'est pas conçu comme un élément de sécurité réseau et c'est correct (pour la même raison, Microsoft Office ne stationne pas votre voiture). C'est hyperbolique au moins de dire que WP devrait faire beaucoup plus de vérification que superficiel, mais je conviens qu'il doit y avoir plus de travail de sécurité, mais pas que WP est un véhicule approprié pour ce travail (il est presque trop grand en l'état)
MrMesees
en fait, les navigateurs inspectent le contenu dans toutes sortes de situations developer.mozilla.org/en-US/docs/Mozilla/… et ils ne regardent jamais l'extension. Et oui, personne ne s'attend à ce que wordpress se concentre sur le renforcement de la sécurité;)
Mark Kaplun
Première chose, un article de blog d'un navigateur! = Tous les navigateurs. Je sais que Chrome fait attention au mime. Deuxièmement, l'introspection des fichiers suit des règles; ce n'est pas une forme libre comme le suggère le langage lâche. Une validation plus complète échange les performances contre la flexibilité (elle fonctionne sur des clients de niveau PC unique, pas sur des offres publiques multi-utilisateurs). Pour prouver que Firefox est ouvert, 100 onglets ouverts examinent l'utilisation de la mémoire et du processeur. Essayez la même chose avec 100 demandes de site Web! Dernière chose, s'il vous plaît, arrêtez, sauf si vous avez des faits réels à ajouter et non des digressions. C'est assez aggravant et ne profite à personne.
MrMesees
inspecter les 256 premiers octets d'un fichier qui vient d'être téléchargé n'atteindra presque aucun impact sur les performances, car le fichier est probablement dans la mémoire ou le cache SSD, et cela pâlit dans tous les cas lorsque vous le comparez au hit de performances résultant du redimensionnement des fichiers, de la génération de vignettes et de ce que ne pas. Quant aux autres navigateurs, pas exactement dans le même flux de code, mais à partir de ce stackoverflow.com/questions/1201945/…, il n'est pas tiré par les cheveux de supposer que Chrome et Firefox sont très alignés
Mark Kaplun