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がコメントしているように、このコードはシェル引数インジェクションに対して脆弱です。基本的に、誰でも post パラメーターを操作して、必要なコマンド ラインを実行させることができます。これは悲惨な結果を招く可能性があり、すぐに対処する必要があります。

セキュリティの問題を修正する 1 つの方法は、使用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

まず、ジョンの回答とプリズナーのコメントです。$src POST 変数をエスケープして、次を使用してシェル コマンド インジェクションを防止する必要がありますescapeshellarg()

$src = escapeshellarg($_POST);

さらに、2 番目のパラメーター (コマンドの出力) と 3 番目のパラメーター (コマンドの戻り値) を使用し、それを尊重する必要があります。

次のように呼び出しexec()ます。

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

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

これで、エラーに対応できるようになり、何が問題なのかを確認できます。シェルリダイレクトを使用して、imagemagick の stderr を stdout にリダイレクトしたことに注意してください ( 2>&1)

于 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 に答える