Име | По подразбиране | Промяна във | Промени |
---|---|---|---|
safe_mode | "0" | PHP_INI_SYSTEM | Премахнато в PHP 6.0.0. |
safe_mode_gid | "0" | PHP_INI_SYSTEM | Достъпно от PHP 4.1.0. Премахнато в PHP 6.0.0. |
safe_mode_include_dir | NULL | PHP_INI_SYSTEM | Достъпно от PHP 4.1.0. Премахнато в PHP 6.0.0. |
safe_mode_exec_dir | "" | PHP_INI_SYSTEM | Премахнато в PHP 6.0.0. |
safe_mode_allowed_env_vars | "PHP_" | PHP_INI_SYSTEM | Премахнато в PHP 6.0.0. |
safe_mode_protected_env_vars | "LD_LIBRARY_PATH" | PHP_INI_SYSTEM | Премахнато в PHP 6.0.0. |
open_basedir | NULL | PHP_INI_ALL | PHP_INI_SYSTEM в PHP < 6. |
disable_functions | "" | php.ini only | Достъпно от PHP 4.0.1. |
disable_classes | "" | php.ini only | Достъпно от PHP 4.3.2. |
За повече подробности и дефиниция на константите PHP_INI_* вижте ini_set().
Тук има кратко описание на конфигурационните директиви.
Указва включване на защитен режим.
По подразбиране защитният режим прави сравнителна проверка по потребителско име (UID) при отваряне на файл. Ако желаете вместо това да се прави проверка по група (GID), установете safe_mode_gid в on. Указва проверка на UID (FALSE) или GID (TRUE) при достъп до файл.
Проверките 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. В по-ранни версии, всички файлове могат да бъдат включвани.Ако PHP е стартирано в защитен режим, функцията system() и други функции стартиращи системни програми отказват да стартират програми, които не са в тази директория. Трябва да използвате / като разделител на пътя на всички операционни системи, включително и Windows.
Указването на конкретни системни променливи може да доведе до потенциален пробив в сигурността. Тази директива съдържа разделен със запетайки списък с представки. В защитен режим потребителят може да променя само тези системни променливи, които са с представката указана тук. По подразбиране на потребителите е разрешено да променят само системни променливи започващи с PHP_ (например PHP_FOO=BAR).
Забележка: Ако тази директива е празна, PHP ще позволи на потребителите да променят ВСИЧКИ системни променливи!
Тази директива съдържа разделен със запетаи списък на системни променливи, които потребителят няма да може да променя чрез функцията putenv(). Тези променливи ще бъдат защитени, дори и ако safe_mode_allowed_env_vars позволява променянето им.
Ограничава файловете, които могат да бъдат отваряни от PHP в определеното дърво от папки, включващо самия файл. Тази директива НЕ се влияе от това дали защитният режим е включен или не.
Когато даден скрипт опита да отвори файл, например чрез функцията fopen() или gzopen(), местоположението на файла бива проверено. Ако файлът е извън указаното дърво от папки, PHP няма да го отвори. Всички символни връзки се анализират, така че няма да можете да избегнете това ограничение чрез символна връзка. Ако файлът не съществува, символната връзка не може да бъде анализирана и тогава името на файла се сравнява с (анализиран) open_basedir .
Специалната стойност .
показва, че работната директория на скрипта ще бъде използвана като
базова. Това обаче е малко опасно, тъй като работната директория може да
бъде сменена лесно чрез chdir().
В httpd.conf, open_basedir може да бъде изключена (например при някои виртуални хостове) по същия начин както всяка друга конфигурационна директива с "php_admin_value open_basedir none".
В Windows разделяйте папките с точка и запетая. При всички други системи разделяйте директориите с двоеточие. Като модул на Apache, пътищата open_basedir на родителските папки се наследяват автоматично.
Указаният път всъщност е представка, а не име на директория. Това означава, че "safe_mode_include_dir = /dir/incl" позволява достъп и до "/dir/include" и "/dir/incls" ако те разбира се съществуват. Когато искате да ограничите достъпа само до конкретна директория, завършвайте пътя с наклонена черта. Например: "safe_mode_include_dir = /dir/incl/"
Забележка: Поддръжката на множество папки е добавена във версия 3.0.7.
По подразбиране всички файлове са разрешени за отваряне.
Забележка: Бележка за достъпност
Тази директива е достъпна от версия PHP 4.3.2
Вж. още: register_globals, display_errors и log_errors.
Когато защитният режим е включен, 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.
Ако вместо защитен режим, установите директория 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
Разбира се, тези ограничения в PHP не важат за стартираните бинарни файлове.