GD 库裁剪图像不起作用

Posted

技术标签:

【中文标题】GD 库裁剪图像不起作用【英文标题】:GD Library crop image not working 【发布时间】:2013-10-08 19:52:13 【问题描述】:

我正在尝试使用以下脚本裁剪 JPG 文件:

if (isset($_POST['crop_attempt'])) 

    echo($_POST['path']);

    $source_img = imagecreatefromjpeg($_POST['path']);
    $dest_img = imagecreatetruecolor($_POST['crop_w'], $_POST['crop_h']);

    imagecopy(

        $dest_img,
        $source_img,
        0,
        0,
        $_POST['crop_l'],
        $_POST['crop_t'],
        $_POST['crop_w'],
        $_POST['crop_h']

    );

    imagejpeg($dest_img, $_POST['path']);

    imagedestroy($dest_img);

    imagedestroy($source_img);

我通过 ajax 通过以下 javascript 对象中的 $_POST 变量发送:

var db_data = 
        left        :   db.offset().left - img_pos.left * ratio,
        top         :   db.offset().top - img_pos.top * ratio,
        width       :   db.width() * ratio,
        height      :   db.height() * ratio,
        crop_attempt:   true,
        path        :   $('._jsImageToCrop').attr('src')
    ;

这些值都在通过,我已经从 php 脚本中回显了它们,我认为问题与 imagecreatefromjpeg() 函数有关,任何对 GD 库有更多经验的人都可以提供任何帮忙?

谢谢。

【问题讨论】:

【参考方案1】:

考虑 PHP 将从 AJAX 调用中得到什么——客户端元素的src 属性,类似于/some/subdir/on/your/site/kittens.jpg。您将该值直接发送到imagecreatefromjpeg(),它会在您的服务器上查找/some/subdir/....,但它不存在......因为它缺少您网站的DOCUMENT_ROOT,这将使实际路径/path/to/your/site/doc/root/some/subdir/....

你不应该在这样的文件系统操作中使用外部数据。虽然您只是将它传递给 imagecreatefromjpeg(),但它仍然不安全,因为您允许用户直接提供完整路径,这意味着他们可以在您的服务器上加载任何他们知道路径的任何图像,任何地方。

【讨论】:

感谢 Marc,您的回答帮助我解决了我的问题,也感谢您的建议,我会想出一个更安全的解决方案。

以上是关于GD 库裁剪图像不起作用的主要内容,如果未能解决你的问题,请参考以下文章

图像视图裁剪不起作用

使用 imagemagick linux 脚本裁剪图像不起作用

Imagemagick 裁剪不起作用

使用 Imagemagick 裁剪图像的一部分并将其粘贴到另一个图像中不起作用

使用imagemagick linux脚本裁剪图像不起作用

复制图像变量 GD 库