Безопасность и безопасный режим
Конфигурационные опции, управляющие безопасным режимом и вопросами безопасности
Имя |
По умолчанию |
Меняемо |
Список изменений |
safe_mode |
"0" |
PHP_INI_SYSTEM |
Удалена в версии PHP 5.4.0. |
safe_mode_gid |
"0" |
PHP_INI_SYSTEM |
Доступно начиная с версии PHP 4.1.0. Удалена в версии PHP 5.4.0. |
safe_mode_include_dir |
NULL |
PHP_INI_SYSTEM |
Доступно начиная с версии PHP 4.1.0. Удалена в версии PHP 5.4.0. |
safe_mode_exec_dir |
"" |
PHP_INI_SYSTEM |
Удалена в версии PHP 5.4.0. |
safe_mode_allowed_env_vars |
"PHP_" |
PHP_INI_SYSTEM |
Удалена в версии PHP 5.4.0. |
safe_mode_protected_env_vars |
"LD_LIBRARY_PATH" |
PHP_INI_SYSTEM |
Удалена в версии PHP 5.4.0. |
Для подробного описания констант
PHP_INI_*, обратитесь к разделу
Где могут быть установлены параметры конфигурации.
Краткое разъяснение конфигурационных
директив.
-
safe_mode
boolean
-
Включает/отключает безопасный режим в PHP.
Если PHP скомпилирован с опцией --enable-safe-mode,
то по умолчанию принимает значение On (включено), иначе - Off (выключено).
ВниманиеС версии PHP 5.3.0 эта возможность считается
УСТАРЕВШЕЙ. Крайне не рекомендуется полагаться на эту возможность.
-
safe_mode_gid
boolean
-
По умолчанию в безопасном режиме при открытии файла выполняется
проверка значения UID. Для того, чтобы немного смягчить это условие и
выполнять проверку GID, необходимо установить значение on для флага safe_mode_gid.
Определяет, использовать ли проверку UID (FALSE) или
GID (TRUE) проверку при обращении к файлу.
-
safe_mode_include_dir
string
-
При подключении файлов, расположенных в указанной директории и всех ее подкаталогах,
проверка на соответствие значений UID/GID
не выполняется (в случае, если установленная директория не указана в
include_path,
необходимо указывать полный путь при включении).
Начиная с PHP 4.2.0 значением этой директивы может быть список каталогов,
разделенных двоеточием (точкой с запятой на Windows-системах), что аналогично
синтаксису include_path.
Указанное значение в действительности является префиксом, а не названием
директории. Это означает, что запись
"safe_mode_include_dir = /dir/incl" позволяет
подключать файлы, находящиеся в директориях "/dir/include"
и "/dir/incls", в случае, если они существуют.
Если вы хотите указать доступ к конкретной директории,
используйте завершающий слэш, например: "safe_mode_include_dir = /dir/incl/"
Если значение этой директивы пусто, то никакие файлы с отличающимися
UID/GID не могут быть подключены в
версии PHP 4.2.3 и начиная с версии PHP 4.3.3. В более ранних версиях
подключались все файлы.
-
safe_mode_exec_dir
string
-
В случае, когда PHP работает в безопасном режиме,
system() и другие функции
запуска программ отклоняют выполнение программ, находящихся вне
данной директории. Вам также придется использовать /
в качестве разделителя пути на всех окружениях, включая Windows.
-
safe_mode_allowed_env_vars
string
-
Возможность устанавливать переменные окружения - потенциальная
брешь в безопасности. Значением этой директивы является
список префиксов, разделенных двоеточиями. В безопасном режиме
пользователь может модифицировать только те переменные окружения,
имена которых начинаются с одного из указанных префиксов. По умолчанию,
пользователю доступны переменные, которые начинаются с префикса PHP_
(например, PHP_FOO=BAR).
Замечание:
В случае, если этой директиве указать пустое значение, пользователь получит
возможность модифицировать ЛЮБУЮ переменную окружения!
-
safe_mode_protected_env_vars
string
-
Эта директива содержит список переменных окружения, разделенных двоеточием,
значение которых пользователь не сможет изменить, используя
функцию putenv(). Значения этих переменных
остаются защищенными, даже если их модификация разрешена
директивой safe_mode_allowed_env_vars.
Смотрите также:
open_basedir,
disable_functions,
disable_classes,
register_globals,
display_errors, и
log_errors
В случае, если включена директива safe_mode,
PHP проверит, совпадает ли владелец скрипта и владелец файла или директории,
которыми оперирует скрипт. Например:
-rw-rw-r-- 1 rasmus rasmus 33 Jul 1 19:20 script.php
-rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd
Выполнение скрипта
script.php
<?php
readfile('/etc/passwd');
?>
в случае использования безопасного режима приводит к следующей ошибке:
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not
allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2
Тем не менее, предусмотрена возможность вместо проверки на соответствие
UID использовать более мягкую проверку на соответствие
GID. Для этого необходимо использовать директиву
safe_mode_gid. В случае, если она
установлена значением On, используется более мягкая
проверка GID. В противном случае, если установлено значение
Off (значение по умолчанию), выполняется более строгая проверка
на соответствие UID.
В качестве альтернативы директиве safe_mode
вы можете ограничить все выполняемые скрипты жестко заданным
деревом директорий при помощи опции open_basedir.
Например (фрагмент конфигурационного файла httpd.conf):
<Directory /docroot>
php_admin_value open_basedir /docroot
</Directory>
При попытке выполнить тот же самый скрипт
script.php
с указанной опцией
open_basedir
вы получите следующий результат:
Warning: open_basedir restriction in effect. File is in wrong directory in
/docroot/script.php on line 2
Вы также можете запретить отдельные функции. Следует заметить, что
директива
disable_functions
может быть указана исключительно в конфигурационном файле php.ini,
это означает, что вы не можете, отредактировав httpd.conf, установить
индивидуальные значения для конкретного виртуального хоста или каталога.
Если добавить в php.ini следующую строку:
disable_functions = readfile,system
Результатом работы скрипта будет следующий вывод:
Warning: readfile() has been disabled for security reasons in
/docroot/script.php on line 2
Внимание
Разумеется, эти ограничения PHP не работают в запускаемых программах.