Перехват функций – архиполезная штука. Если нет возможности изобрести пяттиколесный велосопед, поймать опасную функцию (системную команду) за хвост можно с помощью модуля Baxtep (спасибо Андрею).
Baxtep – PHP security extension to intercept execution of system commands.
Для сборки модуля понадобятся пара прямых рук и такие команды:
# скачиваем с репозитория svn checkout https://baxtep.googlecode.com/svn/trunk/ baxtep # переходим в каталог cd baxtep # собираем: phpize # если у вас PHP в нестандартном каталоге, укажите полный путь: # /usr/local/php5-fcgi/bin/phpize ./configure make # закиньте модуль в папку с модулями: cp .libs/baxtep.so /usr/local/php5-fcgi/lib/php/extensions/no-debug-non-zts-20060613/baxtep.so # каталог с модулями можно определить командой php -i | grep extension_ # или по полному пути: # /usr/local/php53-fcgi/bin/php -i | grep extension_ # php.ini можно найти тоже через php -i, добавьте туда: baxtep.logfile = "/tmp/baxtep_messages" # или укажите другой путь, куда удобнее. я добавил строчку перед # [Zend]
Все, перезапускайте Apache/PHP, в зависимости от того, что вам нужно перезапустить, чтобы модуль подгрузился. Вахтер послушно запишет в лог-файл все системные вызовы, например:
2012-02-25 19:35:39 BAXTEP: proc_open CMDLINE: `php` FILE: /path/to/file/1.php on line 11 URI: /1.php 2012-02-25 19:35:39 BAXTEP: shell_exec CMDLINE: `date` FILE: - on line 1 URI: (null)
Среди опасных, есть еще функция proc_open, чтобы ее перехватывать, нужно добавить в файл baxtep.c строчку:
php_baxtep_substitute_function("proc_open" TSRMLS_CC);
и пересобрать/переподгрузить модуль.
Список функций, которые я блокирую, если в них нет острой необходимости (php.ini):
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec