В PHP есть такая замечательная настройка как disable_functions, которая позволяет отключить использование определенных функций. Это очень удобно с точки зрения безопасности. Наиболее распространенный способ применения – запретить использовать шелл вызовы:
disable_functions="popen,exec,system,passthru,proc_open,shell_exec"
Поскольку на шелл вызовы не распространяется open_basedir ограничение (например, можно спокойно посмотреть system(«ls /«); с включенным 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 имеют независимые конфиги и в последнем отключены шелл вызовы.
Посты
Для того, чтобы использовать «disable_functions» в virtual host нужен suhosin patch. Параметр называется по другому, но смысл тот же. Незаменимая вещь для shared хостинга, когда отдельным сайтам нужно разрешить использование потенциально небезопасных функций.
В документации сказано что список функций должен быть разделен двоеточием, у Вас запятыми будет ли это работать, нет ли здесь ошибки?
буду краток. запятые работают.
==========WEB SCRIPT===============
< ?
$a=ini_get('disable_functions');
echo "Disabled functions: $a
«;
echo «Trying popen()…»;
ini_set(‘error_reporting’,E_ALL);
ini_set(‘display_errors’,1);
$p=popen(‘/bin/true’,'r’);
if ($p) {
echo «Hmmmm!!!! SUCCESS
«;
pclose($p);
} else {
echo «Works! failure
«;
}
?>
=============OUTPUT=========================
Disabled functions: popen,exec,system,passthru,proc_open,shell_exec
Trying popen()…
Warning: popen() has been disabled for security reasons in /home/foobar/domain.com/x.php on line 7
Works! failure
======================================
Хм…
Извините, не админ, но вопрос а конструкцию « как отрубить?
Т.е. echo `less /etc/passwd`; – как пример.
А слона то и не заметили… ) подумаем
>Извините, не админ, но вопрос а конструкцию “ как отрубить?
>Т.е. echo `less /etc/passwd`; – как пример.
http://php.net/manual/ru/language.operators.execution.php
Замечание: Обратные кавычки недоступны, в случае, если установлен безопасный режим или отключена функция shell_exec().
А shell_exec() отключен.
Подтверждаю, при отключенном shell_exec обратные кавычки не работают.
Я обычно отключаю вот эти:
;disable_functions = show_source, system, shell_exec, passthru, exec, phpinfo, popen, proc_open
;The first line disables URL-aware fopen wrappers that enable accessing URL object like files. The second one disables a l
;shows_source — an alias of highlight_file() which provides syntax highlighting for files;
;system — allows execution of external programs;
;shell_exec — allow execution of commands via a shell;
;exec — allow execution of commands;
;passthru — similar to the exec() function, allows execution of commands;
;phpinfo — outputs PHP information that could be used by potential intruders;
;popen — opens a pipe to a process being executed by a certain command;
;proc_open — similar to popen() but provides better control over command execution.
disable_functions = system,exec,curl_exec,curl_multi_exec,passthru,shell_exec,proc_open,popen,parse_ini_file,show_source,ini_restore,com_load_typelib,symlink
Уважаемый Pandora, объясните чем так опасен то curl_exec и мультик? А по поводу show_source, parse_ini_file – может еще для надежности fopen() отключим а? ))
залил для теста на сервак шел r57 и заметил что спокойно могу смотреть файл php.ini ну меня это не очень то порадовало.. и прописал я в disable_functions parse_ini_file и все равно можно смотреть файл php.ini, странно конечно, может вы знаете как можно по другому php.ini скрыть ?
1. parse_ini_file не имеет отношения к возможности или невозможности просмотра php.ini
2. Где ваш php.ini вообще лежит? Ограничьте исполняемый скрипт рамками open_basedir.
он лежит у меня в /etc/php5/apache2/php.ini так вот в вирт хосте прописан open_basedir и не помогло, странно…
lone_wolf, может быть, фактически не сам php.ini читается, а просто соответствующий скрипт просто получает значения всех опций с помощью ini_get_all() (или ещё как-нибудь)? Естественно, скрипт может получить все настройки среды, в которой он сейчас выполняется, и это никак не изменишь.