 |
- Содержание
- Функции,
ограниченные/отключённые режимом safe mode.
Безопасный режим PHP
это попытка разрешения проблемы безопасности совместно используемого сервера.
Архитектурно некорректно пытаться решить эту проблему на уровне PHP, но, поскольку
альтернативы уровня web-сервера и ОС не слишком реалистичны, многие, особенно
ISP, используют safe mode. Таблица 23-1. Директивы
конфигурации, управляющие режимом safe modeКогда 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. Таблица 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 | ?? |
|  |