Безопасный Режим/Safe Mode
Глава 23. Безопасный режим/Safe Mode
Безопасный режим PHP это попытка разрешения проблемы безопасности совместно используемого сервера. Архитектурно некорректно пытаться решить эту проблему на уровне PHP, но, поскольку альтернативы уровня web-сервера и ОС не слишком реалистичны, многие, особенно ISP, используют safe mode.
Таблица 23-1. Директивы конфигурации, управляющие режимом safe mode
Директива | Значение по умолчанию |
---|---|
safe_mode | Off |
safe_mode_gid | 0 |
safe_mode_include_dir | "" |
safe_mode_exec_dir | 1 |
open_basedir | "" |
safe_mode_allowed_env_vars | PHP_ |
safe_mode_protected_env_vars | LD_LIBRARY_PATH |
disable_functions | "" |
Когда safe_mode включён/on, PHP проверяет, совпадает ли owner/владелец текущего скрипта с owner файла, которым оперирует функция работы с файлами. Например:
-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'); ?> |
приводит к такой ошибке, если safe mode активен:
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, то все операции с файлами будут проводиться только с файлами в пределах этой директории. Например (пример Apache 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 |
Функции, ограниченные/отключённые режимом safe mode
Это, скорее всего, неполный и, возможно, не вполне корректный листинг функций, ограниченных режимом safe mode.
Таблица 23-2. Функции, ограниченные безопасным режимом/Safe mode
Функция | Ограничения |
---|---|
dbmopen() | Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. |
dbase_open() | Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. |
filepro() | Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. |
filepro_rowcount() | Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. |
filepro_retrieve() | Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. |
ifx_*() | ограничения sql_safe_mode, (!= safe mode) |
ingres_*() | ограничения sql_safe_mode, (!= safe mode) |
mysql_*() | ограничения sql_safe_mode, (!= safe mode) |
pg_loimport() | Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. |
posix_mkfifo() | Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт. |
putenv() | Подчиняется ini-директивам safe_mode_protected_env_vars и safe_mode_allowed_env_vars. См. также документацию putenv(). |
move_uploaded_file() | Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. |
chdir() | Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт. |
dl() | Эта функция отключена в режиме safe mode. |
Операция backtick | Эта функция отключена в режиме safe mode. |
shell_exec() (функциональный эквивалент backtick'ов) | Эта функция отключена в режиме safe mode. |
exec() | Вы можете выполнять исполняемые файлы только внутри safe_mode_exec_dir. Из практических соображений вам в настоящее время не разрешается иметь компоненты .. в пути к исполняемому файлу. |
system() | Вы можете выполнять исполняемые файлы только внутри safe_mode_exec_dir. Из практических соображений вам в настоящее время не разрешается иметь компоненты .. в пути к исполняемому файлу. |
passthru() | Вы можете выполнять исполняемые файлы только внутри safe_mode_exec_dir. Из практических соображений вам в настоящее время не разрешается иметь компоненты .. в пути к исполняемому файлу. |
popen() | Вы можете выполнять исполняемые файлы только внутри safe_mode_exec_dir. Из практических соображений вам в настоящее время не разрешается иметь компоненты .. в пути к исполняемому файлу. |
mkdir() | Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт. |
rmdir() | Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. |
rename() | Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт. |
unlink() | Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт. |
copy() | Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт. (on source and target ) |
chgrp() | Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. |
chown() | Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. |
chmod() | Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. Кроме того, вы не можете установить SUID, SGID и sticky-биты. |
touch() | Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт. |
symlink() | Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт. (Примечание: проверяется только target/цель) |
link() | Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт. (Примечание: проверяется только target/цель) |
getallheaders() | В безопасном режиме header'ы, начинающиеся с 'authorization' (нечувствительно к регистру), не будут возвращаться. Предупреждение: это нарушено реализацией aol-сервером функции getallheaders() ! |
header() | В безопасном режиме uid скрипта добавляется в часть realm шапки WWW-Authenticate, если вы устанавливаете эту шапку/header (используемую для HTTP Authentication). |
highlight_file(), show_source() | Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт. (Примечание: работает, только начиная с PHP 4.2.1) |
parse_ini_file() | Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт. (Примечание: работает, только начиная с PHP 4.2.1) |
Любая функция, использующая php4/main/fopen_wrappers.c | ?? |