В PHP есть такая замечательная настройка как disable_functions, которая позволяет отключить использование определенных функций. Это очень удобно с точки зрения безопасности. Наиболее распространенный способ применения – запретить использовать шелл вызовы:

disable_functions="popen,exec,system,passthru,proc_open,shell_exec"

Поскольку на шелл вызовы не распространяется open_basedir ограничение (например, можно спокойно посмотреть systemls /«); с включенным open_basedir), эта «дырка» сводит на нет все ограничения безопасности и позволяет работать remote shell’ам даже с включенным ограничением open_basedir.

Было бы логично добавить в конфигурацию virtual host такие строки:

php_admin_value "open_basedir" "/home/foobar/foobar.com"
php_admin_value "disable_functions" "popen,exec,system,passthru,proc_open,shell_exec"

Но это не сработает, т.к. disable_functions работает только когда включен в глобальном php.ini.

Конечно, в phpinfo() вы увидите правильное значение disable_functions, однако «отключенные» функции будут продолжать действовать. Разработчики объяснили это тем, что отключать функции на уровне конфигурации апача очень накладно, гораздо проще выключить их вообще из php.ini

Но с другой стороны, шелл вызовы достаточно часто используются в CLI скриптах, в то время как в веб скриптах в большинстве случаев их можно отключить. Значит нужно разделить конфиги CLI и Web. В первом конфиге оставить шелл вызовы, а во втором, более подверженном хаку, их отключить.

Предположим, что дефолтный конфиг php.ini лежит в /usr/local/lib (стандартное место на FreeBSD). Скопируем его в /usr/local/etc/apache2. И на новом месте пропишем нужные disable_functions. Далее, в httpd.conf пишем:

PHPIniDir /usr/local/etc/apache2/conf

И рестартуем апач. Все, теперь CLI и Web версии PHP имеют независимые конфиги и в последнем отключены шелл вызовы.