T

PHPをCLIで実行するとphp.iniによるセキュリティ制限は無意味なんだね

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の実行時には全く無意味であることがわかった。めでたしめでたし。

Posted by on 10月 25, 2007 in PHP, Security

コメントを残す