今回で最終回になります。php.ini設定関連の注意事項,セキュリティに関係したPHP5の新機能などを解説します。
特に記述がない場合,PHP4はPHP4.4.x,PHP5はPHP5.2.xを意味します。
php.ini設定によるオブジェクトの動作仕様の変更
zend.ze1_compatibility_mode
この設定はPHP5のオブジェクトのふるまいに影響します。デフォルトは無効(off)に設定されています。この設定を有効(on)に設定すると,オブジェクトのクローニング,比較動作,キャスティングがPHP4と同様になります。
例:ze1_compatibility_mode設定のコピー動作
<?php
class foo {}
$obj1 = new foo;
$obj2 = $obj1;
if ($obj1 == $obj2) {
echo 'case1: $obj1 == $obj2';
}
$obj1->var = true;
if ($obj1 == $obj2) {
echo 'case2: $obj1 == $obj2';
}
?>
このコードをze_compatibility_modeが有効なPHP5で実行した場合,2つ目のecho文は実行されずPHP4と同じくオブジェクト変数をコピーする動作になります。
オブジェクトの動作に関連する部分は修正が必要な個所を見つけ出すことが難しい場合もあるので,PHP5のオブジェクトをPHP4オブジェクトのように動作するよう設定できます。
とはいえ,zend.ze1_compatibility_modeを有効にしてもempty関数の動作には影響は与えません。PHP5ではプロパティを持たないオブジェクトでもオブジェクト変数であるかぎりTRUEと評価されます。$this変数に代入ができない制限もこの設定によって変更されません。これらのコードは修正しないとなりません。
移行時に注意が必要なphp.ini設定
移行する場合にphp.ini設定をPHP5のデフォルト設定から変更しなければならないケースも考えられます。特に重要なphp.ini設定で問題となる可能性がある設定について解説します。
php.iniファイルの移行
php.ini設定ファイルは古いシステムのphp.iniファイルを移行するのではなく,PHP5に付属するphp.ini-recommendedをベースに古い設定が必要な項目を変更する手順をお勧めします。後述しますが古いphp.ini設定を利用した場合,アプリケーションが安全に運用できないケースも発生します。
memory_limit設定
PHP5のmemory_limitのデフォルト値はPHP4の8MBから128MBに大幅に増加されています。アプリケーションによってはDoS攻撃に脆弱になってしまう可能性も考えられます。memory_limit設定はスクリプト中からも変更できる設定なので,必要なメモリ量までに制限するほうが安全です。
ユーザ入力のデータサイズはpost_max_size設定により制限され,デフォルトは8MBです。このため,ユーザ入力の最大値は8MBになります。ファイルアップロードはupload_max_filesize設定により制限され,デフォルトは2MBです。つまり,デフォルト設定ではファイルアップロードやPOSTメソッドにより,簡単に多くのメモリを消費させるDoS攻撃は行いづらくなっています。
memory_limit設定をhttpd.confや.htaccessファイルで設定を変更する場合,スクリプト中からも変更できるようphp_admin_valueでなくphp_valueを利用するとよいでしょう。
例:memory_limitを32MBに設定
php_value memory_limit "32MB"

