0

我正在尝试使用以下脚本裁剪 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 库有更多经验的人都可以提供任何帮助吗?

谢谢。

4

1 回答 1

0

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

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

于 2013-10-08T19:59:51.287 回答