自最近WP更新以来未上传SVG文件


16

我的函数PHP文件中有一个代码片段,可用来上传SVG文件。由于今天已升级到最新版本的WP,因此我无法再上传svgs。我还尝试了CSS技巧网站上的第二个代码段,但这也不起作用。

有人知道a)上次更新可能是什么原因造成的; b)有人知道解决方法。

这是我通常使用的代码:

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

非常感谢

保罗

Answers:


16

在WordPress 4.7.1 中引入一项更改,用于检查上载文件的真实mime类型。这样会中断上传文件类型,例如SVG或DOCX。WordPress Core中已经存在针对此问题的票证,您可以在其中阅读有关此内容的更多信息:

以下插件是一个临时的建议性解决方法(直到解决此问题为止):
禁用Real MIME Check

如果您不想使用该插件,则可以使用以下相同功能:

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

请注意,此片段包含了版本检查,可在WordPress更新后立即禁用此修复程序。

编辑

此问题最初设置为在4.7.2中解决。但是,由于4.7.2是紧急的安全版本,因此该修补程序未纳入该版本。现在应该在4.7.3中进行修复。


2
开发环境的替代解决方法:添加define( 'ALLOW_UNFILTERED_UPLOADS', true );wp-config.php这对于生产是不安全的。
Tim Malone

1
只是为了在一个地方收集所有信息,这里也是一个相关的论坛主题:wordpress.org/support/topic/wp-4-7-1-kills-svg
Tim Malone

谢谢你 目前这不是紧急情况,但很高兴知道有解决方法。非常感谢。
Paul12_

引入了范围广泛的效果,除非专门检查'svg' === strtolower($filetype['ext']);并引入更多工作(如果不需要(主要是)工作或文件不是svg类型)...
MrMesees


2

似乎没有人刚刚使用过,这太糟糕了,所以这就是我的处理方式...

历史/背景

我在2015年根据CSS-Tricks文章研究了SVG上传器。我还让网格可用于图像预览,并使用了其他一些修复程序。简单插件(IMO文件类型插件应该很简单)

4.7进行了一些更改。真正的PITA是对于image/MIME类型,WP现在在图像上使用GD。为了绕过这个,我将svg扩展名设置为使用application/svg+xml以便GD不会弄乱文件。

更新:从4.7.2开始,在某些情况下也发出了一些耀眼的火花

然后稍后通过挂钩将其热线连接回image/svg+xml。它与其他答案中的用法相同,但是我们首先将其锁定在特定情况下以消除影响(它是SVG文件);我们可以依靠阅读$data['ext'](仅通过一个比较和一个数组/哈希访问获得文件信息应该比函数便宜)。

更新:从4.7.2开始$data['ext'],并不总是设置,因此,如果长度小于1,我们现在使用提取文件名的扩展名(可能不安全) strtolower(end(explode('.', $filename)))。我真正使用FileInfo的原因是,基本上依靠PHP扩展太不透明,并且不能总是对所有人都有效(尤其是那些不具有启用扩展名的编译器,如果不存在的话)。我想要一些可以在扩展程序中使用的东西。拥有正确的信息不再是问题,因此对于那些信任输出FileInfo并具有扩展名的人(我相信它在5.6+中是默认值)应该有效。同样因为这是一个插件,所以它不是在修改内核,因此您可以关闭此代码或注销该钩子。

https://github.com/Lewiscowles1986/WordPressSVGPlugin

看到

其他解决方法

允许未经过滤的上载是一个可怕的解决方案,因为正如其他人所说的那样,人们可以通过媒体上载器上载php文件(这很糟糕,如果这样做,您应该停下来想一想!)

强制每个文件通过任何功能而不进行检查(具有讽刺意味的是,如果您具有image/mime类型,则不能仅进行简单的ext检查)。这可能会产生更广泛的影响,以解决相对利基的问题,并整体上引入更多工作(我的插件也为管理员用户引入了更多工作,以使管理媒体用户界面正常工作)

如果我们将mime保留为application / svg + xml并仅过滤了将要上传的mime类型,但是AFAIK需要将修复程序用作特色图像等。在确保通用SVG体验方面还有很多工作要做,所以我选择了仔细挑选战斗。

希望这可以帮助。


好吧,推动这件事发展的核心问题是在发布上传的文件之前没有节制的事实。试图仅仅基于文件扩展名来猜测文件是否为恶意总是一个坏主意。从理论上讲,允许管理员进行所有上传都是没有问题的,因此,尽管其中一些建议的修复程序通常可能范围太广,但实际上它们对于许多人来说已经足够了。旁注IMHO SVG的图像与PDF一样多,从技术上讲不是。
马克·卡普伦

谁想出mime类型的人都与您不同意,全世界的浏览器供应商和软件生产商也是如此。WordPress仅检查扩展名,因为它不旨在作为网络安全的一部分,而且还可以(出于相同的原因,Microsoft Office不会停放您的汽车)。至少要说WP应该比表面做更多的检查是夸张的,但是我同意需要做更多的安全工作,只是不是WP是进行该工作的合适工具(它几乎太大了)
MrMesees

实际上浏览器做各种情况的内容检查developer.mozilla.org/en-US/docs/Mozilla/...,他们从来不看的扩展。是的,没有人期望WordPress在这一点上将重点放在加强安全性上;)
Mark Kaplun'1

首先,一个浏览器的一篇博客文章!=所有浏览器。我知道Chrome会注意哑剧。其次,文件的内省遵循规则。它不是自由语言所建议的自由形式。更全面的验证会牺牲性能来换取灵活性(它适用于单个PC级客户端,而不适用于多用户公开发行)。为了证明这种打开的Firefox,打开100个选项卡可以查看内存和CPU使用率。尝试相同的100个网站请求!最后一件事请停止,除非您有一些实际的事实要补充说明。这相当令人不满,没有使任何人受益。
MrMesees

检查刚上传的文件的前256个字节将确保几乎对性能造成零影响,因为该文件可能位于内存或SSD缓存中,并且在将其与调整文件大小,生成缩略图以及显示的性能与之相比较时,它无论如何都会显得苍白不。至于其他浏览器,而不是完全一样的代码流,但是从这个stackoverflow.com/questions/1201945/...它不是牵强的假设,Chrome和Firefox都非常一致
马克·卡普伦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.