Arquivos SVG não estão sendo carregados desde a atualização mais recente do WP

16

Eu tenho um trecho no arquivo PHP de minhas funções que permite fazer upload de arquivos SVG. Desde a atualização para a versão mais recente do WP hoje, não consigo mais carregar svgs. Eu também tentei um segundo trecho de código no site de truques CSS e isso também não funciona.

Alguém sabe a) o que pode ter causado isso com a última atualização eb) Alguém conhece uma solução alternativa.

Aqui está o código que eu normalmente uso:

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

Muito Obrigado

Paulo.

Paul12_
fonte

Respostas:

16

No WordPress 4.7.1, foi introduzida uma alteração que verifica o tipo real de mímica de um arquivo carregado. Isso interrompe o upload de tipos de arquivo como SVG ou DOCX. Já existem tickets para esse problema no WordPress Core, onde você pode ler mais sobre isso:

Uma solução temporária e recomendada (durante o tempo até que esse problema seja corrigido) é o seguinte plug-in:
Desativar verificação MIME real

Se você não quiser usar esse plug-in, aqui está a mesma funcionalidade:

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

Observe que este snippet possui uma verificação de versão incluída para desativar a correção assim que o WordPress for atualizado.

Editar

O problema foi inicialmente definido para ser corrigido no 4.7.2. Mas como o 4.7.2 era uma versão de segurança urgente , a correção não chegou a essa versão. Agora, ele deve ser corrigido no 4.7.3.

Gchtr
fonte
2
Solução alternativa para ambientes de desenvolvimento: adicione define( 'ALLOW_UNFILTERED_UPLOADS', true );a wp-config.php. Isso não é seguro para produção.
Tim Malone
11
Apenas para recolher todas as informações em um só lugar, aqui está uma discussão no fórum relacionado também: wordpress.org/support/topic/wp-4-7-1-kills-svg
Tim Malone
Obrigado por isso. Não é uma situação urgente no momento, mas é bom saber que há uma solução alternativa. Muito apreciado.
precisa saber é
Apresenta muito amplo efeitos a menos que verifica especificamente para 'svg' === strtolower($filetype['ext']);e introduz mais trabalho no caso nenhum trabalho é necessário (a maioria) ou o arquivo não é do tipo SVG ...
MrMesees
4

Parece que isso pode estar relacionado a este ticket https://core.trac.wordpress.org/ticket/39552 , parece algo que foi quebrado na versão 4.7.1

Mark Kaplun
fonte
Ah, obrigado Mark. Eu pensei que algo estava errado. Espero que seja corrigido em breve.
Paul12_
2

Ninguém parece ter trabalhado com o que é e isso é muito ruim, então aqui está como eu lidei com ...

História / Histórico

Criei um uploader SVG em 2015 com base em um artigo CSS-Tricks, analisando o que era. Também tenho a grade trabalhando para a visualização da imagem e usei algumas outras correções. Plug-in simples (plug-ins do tipo arquivo IMO devem ser simples)

Solução

Houve algumas alterações na versão 4.7. O verdadeiro PITA era que, para os image/tipos MIME, o WP agora usa GD nas imagens. Para contornar isso, defino a svgextensão a ser usada application/svg+xmlpara que o GD não mexa com o arquivo.

Atualização: a partir da versão 4.7.2, alguma faísca brilhante quebrou isso também em alguns casos

Depois, mais tarde, através do gancho, conectamos novamente image/svg+xml. É o mesmo usado em outras respostas, mas em primeiro lugar, bloqueamos o nosso caso específico para eliminar efeitos (é um arquivo SVG); podemos confiar na leitura $data['ext'](deve ser mais barato que a função para obter informações do arquivo, pois apenas uma comparação e um acesso a array / hash).

Atualização: a partir da versão 4.7.2 $data['ext']nem sempre é definida, portanto, se o comprimento for <1, ​​extrair (potencialmente insegura) a extensão do nome do arquivo usando strtolower(end(explode('.', $filename))). A razão pela qual estou realmente lutando com o FileInfo é que depender essencialmente de uma extensão PHP é muito opaco e nem sempre funciona para todos (especialmente para aqueles que estão compilando sem ou sem acesso para habilitar extensões, se não houver). Eu gostaria de algo que funcione, em vez de uma extensão. Não é mais uma questão de ter as informações corretas; portanto, para aqueles que confiam na saída FileInfoe na extensão (acredito que seja o padrão no 5.6+), ele deve funcionar. Também porque este é um plugin, não está modificando o núcleo. Você pode desativar esse código ou cancelar o registro do gancho.

https://github.com/Lewiscowles1986/WordPressSVGPlugin

Vejo

Outras soluções alternativas

Permitir uploads não filtrados é uma solução horrível, porque, como já foi dito, ao vincular esse tópico, as pessoas podem fazer upload de arquivos php via uploader de mídia (isso é ruim e, se você fizer, deve parar e pensar!)

Forçando todos os arquivos através de qualquer função sem verificações (ironicamente, se você possui image/o tipo mime, não pode simplesmente ter uma simples verificação ext). Isso tem o potencial de criar efeitos de alcance muito mais amplo para resolver um problema relativamente de nicho e apresenta mais trabalho geral (ressalte meu plugin também introduz mais trabalho para os usuários administrativos, para que a UI da mídia administrativa funcione)

Se deixássemos o mime como application / svg + xml e filtrássemos os tipos de mime, a imagem seria carregada, mas o AFAIK exigiria que as correções fossem usadas como imagem em destaque etc. Há mais trabalho a ser feito para garantir uma experiência SVG universal, então eu escolhi para escolher batalhas com cuidado.

Espero que isto ajude.

MrMesees
fonte
bem, o principal problema que leva a essa coisa toda é o fato de que não há moderação antes da publicação dos arquivos enviados. Tentar adivinhar se um arquivo é ruim basicamente com base em sua extensão é sempre uma má idéia. em teoria, não há problema em permitir todos os envios pelo administrador; embora algumas das correções sugeridas sejam geralmente muito amplas, na prática elas podem ser boas o suficiente para muitas pessoas. Nota lateral O IMHO SVG é tanto uma imagem quanto um PDF, tecnicamente não é.
precisa saber é o seguinte
quem criou tipos mímicos discorda de você, assim como os fornecedores de navegadores e produtores de software em todo o mundo. O WordPress verifica apenas as extensões, porque não é uma peça de segurança de rede e tudo bem (pelo mesmo motivo, o microsoft office não estaciona seu carro). É hiperbólico, pelo menos, dizer que o WP deve fazer muito mais verificações do que superficial, mas eu concordo que precisa haver mais trabalho de segurança, mas não que o WP seja um veículo apropriado para esse trabalho (é quase grande demais)
MrMesees
na verdade, os navegadores inspecionam o conteúdo em todos os tipos de situações developer.mozilla.org/en-US/docs/Mozilla/… e nunca examinam a extensão. E sim ninguém espera wordpress neste momento para ter um foco na segurança endurecimento;)
Mark Kaplun
Primeira coisa, um artigo de blog de um navegador! = Todos os navegadores. Eu sei que o Chrome presta atenção à mímica. Segunda coisa, a introspecção de arquivos segue regras; não é de forma livre, como sugere a linguagem livre. A validação mais abrangente troca desempenho por flexibilidade (funciona em clientes de nível único para PC, não em ofertas públicas para vários usuários). Para evidenciar esse Firefox aberto, abra 100 guias e observe o uso de memória e CPU. Tente o mesmo com 100 solicitações de site! Última coisa, por favor, pare, a menos que você tenha alguns fatos reais para adicionar, sem digressões. É bastante irritante e não está beneficiando ninguém.
precisa saber é o seguinte
inspecionar os 256 primeiros bytes de um arquivo acabado de carregar garantirá quase zero de desempenho, já que o arquivo provavelmente está na memória ou no cache SSD e, em qualquer caso, empalidece quando você o compara ao desempenho de redimensionar os arquivos, gerar miniaturas e quais não. Quanto a outros navegadores, não exatamente no mesmo fluxo de código, mas a partir deste stackoverflow.com/questions/1201945/... ele não é inverosímil supor que Chrome e Firefox são muito alinhados
Mark Kaplun