【发布时间】:2021-04-28 14:39:22
【问题描述】:
首先,对不起我的语法不好。英语不是我的主要语言...
我正在开发一个完全 AJAX 的 wordpress 主题,其中包含前端线程提交表单,我想添加动画 GIF 支持。
我写了一段使用imagick库的PHP代码:
// there is also another function that
checks image's exif, size, width, height, finfo and retuns true if all good.
// first imagick resize is basicly re-coding the image to kill shell/hack codes in the gif.
$imagick = new Imagick($image['tmp_name']);
$imagick = $imagick->coalesceImages();
foreach($imagick as $frame){
$frame->scaleImage($width, 0);
}
$imagick = $imagick->deconstructImages();
$imagick->writeImages($new_image_name, true);
$imagick->destroy();
// and this one for the thumbnail of the post.
$imagick = new Imagick($image['tmp_name']);
$imagick = $imagick->coalesceImages();
foreach($imagick as $frame){
$frame->scaleImage(wp_get_registered_image_subsizes()["left-frame-thumbnail"]["width"], 0);
}
$imagick = $imagick->deconstructImages();
$imagick->writeImages($new_image_name, true);
$imagick->destroy();
代码就像魅力一样,但我注意到这是一个昂贵的代码。我的意思是如果用户上传一个大的 gif 文件,我认为它会导致 CPU 峰值。
如果我将 GIF 大小限制为 2MB 就没有关系,因为其他问题是帧数。我们知道,当我们调整 GIF 的大小时,我们会拆分所有帧,调整它们的大小并将它们重新连接在一起。有很多 300kb 左右的 gif,但其中包含 50 多个帧。所以帧数也是服务器CPU的问题。
然后我说;嘿!让我们用 Javascript 在客户端调整 gif 的大小!我写了一个在客户端调整 gif 大小的代码。这确实非常有效。
我在服务器端编写了一个代码来获取调整大小的 2 gif 文件并将它们直接保存到服务器(同时检查它们的 exif、尺寸、finfo)。很好,服务器 CPU 很好。
但是!我注意到第一条规则:“永远不要相信来自客户端的数据。”
如果我在客户端调整它的大小,那很好。调整大小会杀死图像中的 hack/shell 代码。但是,如果用户发送假的 2 两个看起来像是刚刚调整大小并通过控制台或其他方式来自表单的文件怎么办?
我的 ajax 提交中已经有一个 CSRF 令牌,但我确定这还不够。
总结:处理动画 GIF 的最佳方式是什么?我做错了什么。
【问题讨论】:
-
在浏览器中调整动画 GIF 的大小时,您实际上做了什么? AFAIK,您只能调整此类图像的大小仅用于表示目的,实际图像未调整大小..? “在我看来它会导致 CPU 峰值”你真的检查过这个还是你认为它会?
-
你好@Teemu!我混合了 2 个 github 项目来调整来自文件输入的 gif 大小。其中一个名为“gifFrames”(将帧拆分为画布),另一个名为 gifShot,可以从画布创建 gif。我无法理解你的第二个问题。我已经用它的宽度调整了实际/原始图像的大小,以针对其中的错误代码进行复制。我正在使用 ryzen 5 3600 CPU 在我的本地主机上制作这个 resize proc,当它调整包含 50+ 帧的 gif 大小时,它需要 4 秒并导致 php CPU 使用率在 %15-20 左右。我认为使用廉价主机的用户网站会死掉。
-
如果我拆分工作怎么办?我可以将 gif 拆分为帧并在浏览器上调整它们的大小,我可以重新加入它们以在服务器端创建 gif?通过这种方式,服务器的 CPU 负载可以显着降低 IMO。我想...
标签: javascript php security gif imagick