携帯から投稿するプラグイン(Ktai Entry)を試していたところ、携帯で撮った写真をローテートする指定を付けるとサーバで受付時にエラーになることがわかりました。

■ 原因は?

どうやら、Ubuntuにもとから入っている PHPの GDライブラリでは ImageRotate()関数が使えなくしてある模様。詳細はよくわかりませんが、ImageRotate()にセキュリティホールがあるようです。セキュリティレポート等を見ると、このようになっています。

PHPをApacheモジュールで共有型ホスティングサービスを利用しているユーザに影響します。SSLを利用している場合は秘密鍵を盗まれます。

Satake Studioの場合、ホスティングはしていますが、ユーザIDを出して自由に使っていただく共有型ではないので、このケースには該当しないようです。

■ 対策

筋がいいのは、Ubuntuにもとから入っている GDはそのままにして、使うところ(WordPressの wp-includesなど)で ImageRotate()関数だけを追加することですが、やってみたところ、関数を定義すると今度は Imagick()がないなど、なかなか一筋縄ではいかないようです。
深追いしてもいいことはなさそうなので、次善の策、PHPのバンドル版のインストールをやってみます。

■ PHPをソースから入れる

手順は次の通りです。

$ mkdir ~/deb
$ mkdir ~/deb/php5
$ cd ~/deb/php5
$ aptitude update        ← apt-getでエラーが出たため
$ sudo apt-get build-dep php5  ← あとで足りないと怒られた
$ sudo apt-get install devscripts ←   〃
$ sudo apt-get install fakeroot  ←   〃
$ sudo apt-get install shtool   ←   〃
$ apt-get source php5
$ cd php5-5.2.4/
$ e debian/rules        ← ※1(--with-gdのディレクトリ指定を外す)
$ debchange -i          ← なにも書かず
$ dpkg-buildpackage -rfakeroot
$ sudo dpkg -i ../*.deb
$ dpkg -l
$ s /etc/init.d/apache2 restart

注意点として、debian/rulesの configureオプションの GD関連パラメータを次のようにします。

–with-gd –with-jpeg-dir –with-png-dir –with-zlib-dir –with-ttf –with-freetype-dir –enable-gd-native-ttf –enable-gd-jis-conv

ディレクトリがついたままだと、バンドル版ではなく、UbuntuデフォルトのPHPと同じ構成になってしまいます。

■ 確認

Ubuntu 8.04にデフォルトで入っているPHP環境

GD Support enabled
GD Version 2.0 or higher

ソースから入れたPHP環境

GD Support enabled
GD Version bundled (2.0.34 compatible)

■ 参考