downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

Ограниченные или недоступные в безопасном режиме функции> <Безопасный режим
[edit] Last updated: Fri, 25 May 2012

view this page in

Безопасность и безопасный режим

Конфигурационные опции, управляющие безопасным режимом и вопросами безопасности
Имя По умолчанию Меняемо Список изменений
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 и была УДАЛЕНА в версии PHP 5.4.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 не работают в запускаемых программах.



add a note add a note User Contributed Notes Безопасность и безопасный режим
bill1 at nospam dot windhome dot com 04-Feb-2012 10:02
The example of setting open_basdir to docroot has the effect of protecting files outside the web site but does NOT PROTECT files INSIDE the website, and could be construed as a suggested use. There is no reason to use open_basedir at all except to protect from misbehaving scripts. If there is a misbehaving script, one would not like it to delete, modify or upload files to the core website either. An example of a safer setting for open_basedir would be /docroot/safedir (or as is used in doc page "Description of core php.ini directives",open_basedir Note, to tighten it from /www/ to /www/tmp).
rayro at gmx dot de 31-Jan-2009 11:18
Theres a failure with open_basedir and per-host configuration
in apache as described in bug #42836: http://bugs.php.net/bug.php?id=42836

I got the same errors on my development windows system and apache 2.2.4 with php 5.3.beta1.

This error (or similar) is shown:
Warning: Unknown: open_basedir restriction in effect. File(...)
is not within the allowed path(s): (� �� �@5�,�)

Fix:
  - try slashes at the end of the folder name
  or
  - put "php_admin_value open_basedir ..." at first of all in the configuration

 
show source | credits | stats | sitemap | contact | advertising | mirror sites