PHP. Руководство по PHP. 2005
Защищенный режим
Глава 42. Защищенный режим
Содержание
Безопасность и защищенный режим
Ограниченные или недоступные в защищенном режиме функции
Защищенный режим в PHP - это попытка решить проблему безопасности на совместно
используемых серверах. Несмотря на то, что концептуально неверно решать
эту проблему на уровне PHP, но поскольку альтернативы уровня веб-сервера или
операционной системы на сегодняшний день отсутствуют, многие пользователи,
особенно провайдеры, используют именно защищенный режим.
Безопасность и защищенный режим
Таблица 42-1. Конфигурационные опции, управляющие защищенным режимом и вопросами безопасности
Имя | Значение по умолчанию | Изменяемость |
---|---|---|
safe_mode | "0" | PHP_INI_SYSTEM |
safe_mode_gid | "0" | PHP_INI_SYSTEM |
safe_mode_include_dir | NULL | PHP_INI_SYSTEM |
safe_mode_exec_dir | "" | PHP_INI_SYSTEM |
safe_mode_allowed_env_vars | PHP_ | PHP_INI_SYSTEM |
safe_mode_protected_env_vars | LD_LIBRARY_PATH | PHP_INI_SYSTEM |
open_basedir | NULL | PHP_INI_SYSTEM |
disable_functions | "" | PHP_INI_SYSTEM |
disable_classes | "" | PHP_INI_SYSTEM |
Для получения более детальной информации о константах вида PHP_INI_*
ознакомьтесь с функцией ini_set().
Краткое разъяснение конфигурационных
директив.
Включает/отключает защищенный режим в PHP. Для получения более
детальной информации ознакомьтесь с разделом Безопасность.
По умолчанию в защищенном режиме при открытии файла выполняется
проверка значения UID. Для того, чтобы немного смягчить это условие и
выполнять проверку GID, необходимо установить значение on для флага safe_mode_gid.
Определяет, использовать или нет проверку UID (FALSE) или
GID (TRUE) проверку при обращении к файлу.
При подключении файлов, расположенных в указанной директории и всех ее подкаталогах,
проверка на соответствие значений UID/GID
не выполняется (В случае, если установленная директория не указана в include_path,
необходимо указывать полный путь при включении).
Начиная с PHP4.2.0 значением этой директивы может быть список каталогов,
разделенных двоеточием (точкой с запятой на windows-системах), что аналогично
синтаксису include_path.
Указанное значение в действительности является префиксом, а не названием
директории. Это означает, что запись
"safe_mode_include_dir = /dir/incl" позволяет подключать файлы, находящиеся
в директориях "/dir/include" и "/dir/incls", в случае, если они существуют.
Если вы хотите указать доступ к конкретной директории, используйте завершающий слеш, например:
"safe_mode_include_dir = /dir/incl/".
В случае, когда PHP работает в защищенном режиме,
system() и другие функции
для выполнения системных команд и программ
отклоняют выполнение программ, находящихся вне данной директории.
Возможность устанавливать переменные окружения - потенциальная
брешь в безопасности. Значением этой директивы является
список префиксов, разделенных двоеточиями. В защищенном режиме
пользователь может модифицировать только те переменные окружения,
имена которых начинаются с 1 из указанных префиксов. По умолчанию,
пользователю доступны переменные, которые начинаются с префикса PHP_
(например, PHP_FOO=BAR).
Замечание:
В случае, если этой директиве указать пустое значение, пользователь получит
возможность модифицировать любую переменную окружения!
Эта директива содержит список переменных окружения, разделенных двоеточием,
значение которых пользователь не сможет изменить, используя
функцию putenv(). Значения этих переменных
остаются защищенными, даже если их модификация разрешена
директивой safe_mode_allowed_env_vars.
Ограничивает список файлов, которые могут быть открыты в PHP,
указанным деревом директорий независимо от
того, используется защищенный режим или нет.
Каждый раз, когда скрипт пытается открыть файл, например, при помощи
проверяется месторасположение файла. В случае, если он находится
вне указанного дерева директорий, PHP отказывает в открытия файла.
Все символические ссылки распознаются и преобразуются, поэтому обойти
это ограничение при помощи символических ссылок невозможно.
Специальное значение .
указывает, что базовой следует считать директорию, в которой расположен
сам скрипт. В этом случае следует быть осторожным, так как рабочую
директорию скрипта можно легко изменить при помощи функции chdir().
Опция open_basedir может быть отключена в конфигурационном файле
httpd.conf (например, для некоторых виртуальных хостов)
как и любая другая директива: "php_admin_value open_basedir none".
Для Windows-систем разделителем списка директорий служит точка с
запятой. Для всех других операционных систем в качестве разделителя
используется двоеточие. В случае, если PHP работает как модуль веб-сервера
Apache, все указания open_basedir для родительских директорий наследуются.
Указанное значение в действительности является префиксом, а не названием
директории. Это означает, что запись
"safe_mode_include_dir = /dir/incl" позволяет открывать файлы, находящиеся
в директориях "/dir/include" и "/dir/incls", в случае, если они существуют.
Если вы хотите указать доступ к конкретной директории, используйте завершающий слеш, например:
"safe_mode_include_dir = /dir/incl/".
Замечание:
Возможность работы с несколькими директориями добавлена в версии 3.0.7.
По умолчанию разрешен доступ ко всем файлам.
Эта директива позволяет вам запретить некоторые функции из
соображений безопасности.
В качестве значения она принимает список функций, разделенных двоеточием.
disable_functions не зависит от того, используется Защищенный режим или нет.
Эта директива должна быть указана в php.ini. Вы не можете использовать
ее, например, в httpd.conf.
Эта директива позволяет вам запретить некоторые классы из
соображений безопасности.
В качестве значения она принимает список класов, разделенных двоеточием.
disable_classes не зависит от того, используется Защищенный режим или нет.
Эта директива должна быть указана в php.ini. Вы не можете использовать
ее, например, в httpd.conf.
Замечание:
Эта директива доступна, начиная с PHP4.3.2
Ознакомьтесь также со следующими конфигурационными директивами:
В случае, если директива safe_mode
установлена значением on, PHP проверит, совпадает ли владелец скрипта и
владелец файла или директории, которыми оперирует скрипт. Например:
-rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd
выполние срипта script.php
<?
readfile('/etc/passwd');
?>
в случае использования защищенного режима приводит к следующей ошибке:
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):
php_admin_value open_basedir /docroot
</Directory>
При попытке выполнить тот же самый скрипт script.php с
указанной опцией
вы получите следующий результат:
Вы также можете запретить отдельные функции. Следует заметить, что
директива
может быть указана исключительно в конфигурационном файле php.ini,
это означает, что вы не можете, отредактировав httpd.conf, установить
индивидуальные значения для конкретного виртуального хоста или каталога.
Если добавить в php.ini следующую строку:
Результатом работы скрипта будет следующий вывод:
/docroot/script.php on line 2
Постоянные соединения с базами данных
Ограниченные или недоступные в защищенном режиме функции
-rw-rw-r-- 1 rasmus rasmus 33 Jul 1 19:20 script.php
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not
<Directory /docroot>
Warning: open_basedir restriction in effect. File is in wrong directory in
/docroot/script.php on line 2
disable_functions readfile,system
Warning: readfile() has been disabled for security reasons in