4

我正在尝试使用 ImageMagick 进行一些照片处理(暂时裁剪)。我以前通过使用 PHP 的 GD 库(在我的本地主机上)取得了预期的结果,但现在主机不支持它,他们建议我改用 ImageMagick。问题是我可以裁剪存储在本地的图像:

<?php
$four = '4fingers1.jpg';
exec("convert $four -crop 100x100+100+100 test.jpg");
?>
<img src="test.jpg">

没有问题,但是当它来自 http 源(我的脚本的实际目的)时,我没有收到任何图像。代码如下(我以表格的形式发布图像的实际 src):

$src = $_POST['src'];
exec("convert $src -resize 720x720 resized.jpg"); // this is specified in the documentation
exec("convert resized.jpg -crop 100x100+100+100 final.jpg");
?>
<img src="final.jpg"> <!-- no image -->
<img src="resized.jpg"> <!-- no image -->
<img src="<?php echo $src; ?>"> <!-- alright -->

该文档指定以下内容:

IM 还可以通过指定图像 URL 来下载在“万维网”上发布的图像。这基本上提供了一个“http:”图像编码器,这就是它起作用的原因。

链接:http ://www.imagemagick.org/Usage/files/#read

我已经尝试了很多在线创建的代码片段,但无法弄清楚为什么不起作用?我可以使用其他东西来达到我的目的吗?

4

3 回答 3

4

首先,正如 Prisoner评论的那样,这段代码容易受到 shell 参数注入的影响。基本上任何人都可以操纵 post 参数并让您执行他们想要的任何命令行;这可能是灾难性的,应该立即解决!

解决安全问题的一种方法是使用escapeshellarg;这也应该解决您的“原始”问题,因为该命令没有明显的失败原因。如果 URL 有效并且参数被正确转义,它应该可以正常工作。

或者,您可以通过自己下载图像并将其保存到临时文件中,然后再调用 IM 来解决安全问题和原始问题:

$temp = tempnam(sys_get_temp_dir());
file_put_contents($temp, file_get_contents($url));

exec("convert ".escapeshellarg($temp)." -crop 100x100+100+100 test.jpg");
于 2013-04-02T13:20:42.113 回答
0

首先,我同意 Jon 的回答和 Prisoner 的评论。您必须使用以下命令转义 $src POST var 以防止 shell 命令注入escapeshellarg()

$src = escapeshellarg($_POST);

此外,您应该使用第二个参数(命令的输出)和第三个参数(命令的返回值)并尊重它。

像这样调用exec()

exec("convert $src -resize 720x720 resized.jpg 2>&1", $output, $returnval);

if($returnval !== 0) {
    die('imagemagick error: ' . join("<br/>", $output));
}

现在您可以对错误做出反应,并且可以看到出了什么问题。请注意,我已使用 shell 重定向 ( 2>&1)将 imagemagick 的标准错误重定向到标准输出

于 2013-04-02T13:26:39.910 回答
0

问题是 IM 在我的情况下遇到了 https 协议的问题。我已经使用 http 图像进行了测试,一切正常,所以我做了以下操作:

<?php
$src = $_POST['src'];
$src = preg_replace('/^https\:\/\//', 'http://', $src);
$src = escapeshellarg($src);
exec('convert ' . $src . ' resized.jpg 2>&1', $output, $returnval);
if($returnval !== 0) {
    die('imagemagick error: ' . join("<br/>", $output));
}
?>
<img src="resized.jpg">

我现在显示了图像,我可以开始裁剪它等等。

于 2013-04-02T15:11:05.497 回答