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
Сигурност и защитен режим
| Име | По подразбиране | Промяна във | Промени |
|---|---|---|---|
| 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().
Тук има кратко описание на конфигурационните директиви.
- safe_mode boolean
-
Указва включване на защитен режим.
- safe_mode_gid boolean
-
По подразбиране защитният режим прави сравнителна проверка по потребителско име (UID) при отваряне на файл. Ако желаете вместо това да се прави проверка по група (GID), установете safe_mode_gid в on. Указва проверка на 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).
Забележка: Ако тази директива е празна, PHP ще позволи на потребителите да променят ВСИЧКИ системни променливи!
- safe_mode_protected_env_vars string
-
Тази директива съдържа разделен със запетаи списък на системни променливи, които потребителят няма да може да променя чрез функцията putenv(). Тези променливи ще бъдат защитени, дори и ако safe_mode_allowed_env_vars позволява променянето им.
- open_basedir string
-
Ограничава файловете, които могат да бъдат отваряни от 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.
По подразбиране всички файлове са разрешени за отваряне.
- disable_functions string
- Тази директива ви дава възможност да забраните конкретни функции от съображения за сигурност. Въвеждат се чрез списък от разделени със запетая имена на функции. disable_functions не се влияе от това дали защитният режим е включен. Тази директива трябва да бъде конфигурирана в php.ini Не може например да бъде конфигурирана в httpd.conf.
- disable_classes string
-
Тази директива ви дава възможност да забраните конкретни класове от
съображения за сигурност. Въвеждат се
чрез списък от разделени със запетая имена на функции. disable_classes
не се влияе от това дали защитният
режим е включен.
Тази директива трябва да бъде конфигурирана в php.ini Не
може например да бъде конфигурирана в httpd.conf.
Забележка: Бележка за достъпност
Тази директива е достъпна от версия 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 не важат за стартираните бинарни файлове.
Сигурност и защитен режим
31-Jan-2009 07:18
