PHPをCLIで実行するとphp.iniによるセキュリティ制限は無意味なんだね
PHP, Security October 25th, 2007
PHPをCLIモードで実行するとき、オプションに「-d」を指定するとphp.iniなどで設定された値を実行時に上書きできる。ふとヘルプを見たら、そんなオプションがあるのに気付いた。
<?php
print(ini_get('include_path') . "\n");
?>
これを実行すると
$ php -q test.php ./:/usr/lib/php/
こうなるとする。そこで-dオプションを付けると
$ php -q -d include_path=./:/usr/sbin test.php ./:/usr/sbin
こうなる。ふーん、と思ったが、ふと思い立って
<?php
print(ini_get('safe_mode_gid') . "\n");
?>
このディレクティブはPHP_INI_SYSTEMなのでphp.iniかhttpd.confでしか設定できないものだ。ところが
$ php -q test.php $
手元の環境ではOffなので何も返されないが、
$ php -q -d safe_mode_gid=On test.php 1 $
こうするとちゃんとOnになった。つまり、ディレクティブの制限はCLIで実行すれば一般ユーザでも簡単に変更出来てしまうというわけだ。
もうとっくに知られていることなのかもしれないが、これはいくらなんでもちょっとマズいと思われる。CLI用のiniファイルを指定していても、
$ touch ./dummy.ini $ php -c ./dummy.ini -d safe_mode_gid=On ./test.php 1
実行時にiniファイルなんて自分で指定できるので意味がない。まあ、もっともこうやって指定できる時点でiniファイルによるセキュリティ制限など存在しないわけだが。
というわけで、php.iniによるセキュリティ制限はCLIの実行時には全く無意味であることがわかった。めでたしめでたし。