Open basedir что это
Перейти к содержимому

Open basedir что это

  • автор:

Настройка open_basedir на примере VestaCP

В некоторых панелях управления сервером, например VestaCP по-умолчанию директива open_basedir настроена только на запуск php-скриптов внутри директории public_html у домена. Но т.к. ради безопасности нам необходимо разместить файлы проекта выше www, то open_basedir необходимо перенастроить. В противном случае, мы постоянно будем получать ошибку вида File . is not within the allowed path(s).

Можно поменять настройку в основном php.ini распрстранив, таким образом, изменения на весь сервер. Если вы забыли где лежит файл конфигурации то воспользуйтесь командой

$ php -i | grep php.ini

Допустим, нас интересует решение для конкретного домена, а не сервера целиком. На форуме весты есть такое решение: создайте в дополнительный конфигурационный файл /home/%user%/conf/web/httpd.%domain%.conf в котором будет прописано:

  php_admin_value open_basedir none 

Но полностью отключать настройку не всегда безопасно, к тому же, если присмотреться, то в директории /home/%user%/conf/web/ можно найти файл apache2.conf

Открываем его, например, с помощью nano (не забывайте добавлять папаметр -w при открытии конфигурационных файлов)

nano -w home/user/conf/web/apache2.conf

В нём в разделе Directory есть строчка вида

php_admin_value open_basedir /home/user/web/domain/public_html:/home/user/tmp

Здесь указано 2 разрешённых пути, двоеточие — это разделитель между ними. Например, мы хотим разрешить выполнение php в папке project на один уровень выше веб-директории public_html, тогда добавляем в конце строки:

:/home/user/web/domain/project

Сохраняем изменения Ctrl+O, выходим Ctrl+X. Теперь перезапустим апач что бы новые настройки вступили в силу:

etc/init.d/apache2 restart

Всё готово, если что-то не работает ищите опечатку.

Для чего нужна и как использовать open_basedir

Директива open_basedir указывается в конфигурационном файле PHP (php.ini) и устанавливает директории, к которым может иметь доступ PHP. Под доступом понимаются любые действия с файлами: открытие (например, функции fopen() или gzopen()), записи и выполнения. Если директива open_basedir установлена и делается попытка запустить файл, который находится за пределами перечисленных директорий, то скрипт не запустится и выдаст ошибку:

[Wed Apr 1 13:11:34 2020] PHP Warning: Unknown: open_basedir restriction in effect. File(/usr/share/seeker/template/nearyou/php/info.php) is not within the allowed path(s): (/srv/http/:/etc/webapps/:/usr/share/webapps/:/tmp/:/home/mial/) in Unknown on line 0

Пример значения open_basedir:

open_basedir = /srv/http/:/etc/webapps/:/usr/share/webapps/:/tmp/:/home/mial/

В указанном примере разрешён запуск скриптов PHP, а также операции с файлами в директориях:

  • /srv/http/
  • /etc/webapps/
  • /usr/share/webapps/
  • /tmp/
  • /home/mial/

Директива open_basedir оказывает влияние на многие функции. Больше всего в ней смысла при использовании на уровне конфигурационных файлов веб-сервера на уровне директорий или виртуальных хостов.

По умолчанию, если значение open_basedir не установлено, разрешены файловые операции в любых директориях компьютера (на которые достаточно прав).

Опция open_basedir может распространяться не только на функции для работы с файловой системой; например, если MySQL настроен использовать драйвер mysqlnd, то LOAD DATA INFILE подпадает под опцию open_basedir . Множество функций PHP также использует open_basedir.

Специальное значение . (точка) обозначает, что рабочая директория скрипта будет использована в качестве базовой директории. Однако, это немного опасно, так как текущая директория скрипта может быть легко изменена с помощью chdir().

В httpd.conf, open_basedir может быть выключена (например, для некоторых виртуальных хостов) тем же способом, что и любая другая конфигурационная директива:

php_admin_value open_basedir none

В Windows разделяйте директории символом ; (точкой с запятой). На всех остальных системах, разделяйте директории символом : (двоеточием). При работе в качестве модуля Apache, пути open_basedir автоматически наследуются от родительских директорий.

Связанные статьи:

  • Что делать если PHP скрипту не хватает времени и памяти. Почему большой файл не загружается на сайт или в phpMyAdmin (100%)
  • Почему не работают короткие теги в PHP (100%)
  • Как изменить количество цифр после запятой в PHP. Как увеличить точность вычислений в PHP (100%)
  • Как и какие функции отключить в PHP (100%)
  • Как установить веб-сервер Apache с PHP, MySQL и phpMyAdmin на Windows (100%)
  • Как тестировать отправку писем в PHP на Windows (RANDOM — 75%)

Hestia CP: Отключение функции open_basedir

При возникновении на сайте проблемы с загрузкой страниц связанных с функцией open_basedir, о чем свидетельствует ошибка open_basedir restriction in effect (может возникать как на страницах сайта, так и только в [логах ошибок] на сервере) можно отключить эту функцию.

Если коротко, функция open_basedir ограничивает доступ с php скриптов сайта к другим скриптам и каталогам, которые находятся за пределами сайта. Основное ее предназначение изолировать сайты друг от друга, чтобы каждый сайт «видел» только файлы/каталоги своей корневой директории, и не вмешивался в работу других сайтов/каталогов.

Данное руководство актуально только для панели управления Hestia, для других панелей или типов серверов она может быть не актуальна. Перед началом работ, убедитесь, что вы сделали [снапшот сервера]. Все операции производятся на страх и риск владельца сервера.

Следовательно, нужно в темплейт конфиг файле закомментировать строку, имеющую отношение к этой функции. Темплейт файлы располагаются по пути /usr/local/hestia/data/templates/web/php-fpm/ и имеют имена схожие с версиями PHP, для которых нужно отключить open_basedir. Для примера, темплейт для версии PHP 7.4 имеет название PHP-7_4.tpl

В данном файле есть строка php_admin_value[open_basedir] = . наша цель его закомментировать, добавив символ точки с запятой в начало строки, чтобы получилось вот так ; php_admin_value[open_basedir] = .

Для этого можете воспользоваться любым редактором файлов, например nano или vim, или выполните следующую команду, она найдет нужную строку и закомментирует ее. Обратите внимание на имя файла в команде, если у вас другая версия PHP, то не забудьте изменить имя файла, поскольку следующий пример предназначен для PHP 7.4.

sed -i ‘s/php_admin_value\[open_basedir\]/;php_admin_value\[open_basedir\]/g’ /usr/local/hestia/data/templates/web/php-fpm/ PHP-7_4.tpl

Осталось записать изменения с темплейта в основной конфиг сайта и перезагрузить службу PHP 7.4, все это можно сделать как вручную через панель управления и файлы панели, так можно выполнить всего одну команду. Обратите внимание, в команде есть 3 переменные, имя пользователя (admin) панели управления где размещается сайт, домен сайта (example.pp.ua), и название темплейта (PHP-7_4), который мы редактировали выше. Как и в случае выше, измените эти данные в соответствии со своими, прежде чем запускать команду.

v-change-web-domain-backend-tpl admin example.pp.ua PHP-7_4

Готово.

Теперь можно проверить, отключена ли функция с помощью [проверочного php скрипта phpinfo].

Вот как выглядит включенная функция open_basedir (первый скриншот) и когда она выключена (второй скриншот)

Все категории вопросов

  1. Общие вопросы по услуге хостинга
  2. Робота с хостинг 2.0
  3. Работа с базами данных [MySQL]
  4. Работа с FTP
  5. Работа с SSH
  6. Работа с почтой
  7. Работа с Cron
  8. Работа с SSL
  9. Работа с резервным копированием
  10. Работа с htaccess
  11. Работа с CMS
  12. Дополнительные услуги
  13. Нагрузка
  14. Ошибки на сайте
  15. Конструктор сайтов
  1. Регистрация и продление доменов
  2. Управление DNS-записями домена
  3. Трансфер домена
  4. Смена контактных данных владельца домена
  5. Настройка CloudFlare
  1. Общие вопросы по серверам
  2. Администрирование виртуального сервера (VPS)
  3. Администрирование выделенного сервера (DS)
  4. Инструкции по Windows Server
  5. Инструкции по Linux
  6. Панель управления FASTPANEL
  7. Панель управления Hestia CP
  8. Панель управления Vesta CP
  1. Платный SSL-сертификат
  2. Файловое хранилище
  3. SMS-сервис
  4. CallBack-сервис

Ошибка open_basedir restriction in effect. File() is not within the allowed path(s)

open_basedir restriction in effect решение

isFile(): open_basedir restriction in effect. File(gantry-themes:/\beez3) is not within the allowed path(s): (e:/htdocs;e:/ospanel/userdata/temp;e:/ospanel/modules/system/html/openserver;e:/ospanel/modules/php/PHP-5.6)

Или такой вариант

is_dir(): open_basedir restriction in effect

Warning: is_dir(): open_basedir restriction in effect.
File(/plugins/system/nrframework/language)
is not within the allowed path(s): (e:/htdocs;e:/ospanel/userdata/temp;e:/ospanel/modules/system/html/openserver;e:/ospanel/modules/php/PHP-7.0-x64)
in E:\htdocs\localhost\js_kampre\plugins\system\nrframework\NRFramework\Functions.php
on line 383

или такая ошибка

is_writeable(): open_basedir restriction in effect

Warning: is_writeable(): open_basedir restriction in effect. File(/home/u2518645671/public_html/tmp)

или такой вариант

file_exists(): open_basedir restriction in effect

Warning: file_exists() [function.file-exists]:
open_basedir restriction in effect. File(/home/user_name/public_html/wp-content/uploads/2006/12/picture.jpg)

вот ещё один случай:

JFolder::create: Path not in open_basedir paths Unable to create destination

Причины возникновения этой проблемы одинаковые (кроме последнего примера), несмотря на немного разные сообщения об ошибках ⇒ Это меры безопасности на хостинге, сервере, VDS и т.д.

PHP функция open_basedir предотвращает работу (открытие) файлов и скриптов, которые находится вне разрешённый настроками сервера, директории. Если эти open_basedir ограничения включены, то все неавторизованные пользователи получают разрешения и доступ только к разрешённым в настройках папкам на сервере.

Если функция или скрипт пробует открыть (записать в файл), который находится вне папок, куда можно лезть, тогда PHP откажется выполнять это действие и появится ошибка о которой мы говорим open_basedir restriction in effect

⇒ Разберём варианты её решения.

Решение 1 ⇒ отменяем / отключаем open_basedir

1 Отменяем все ограничения open_basedir и открываем доступ ко всем директориям, указав значение
open_basedir = none

Отменяем все ограничения open_basedir и открываем доступ ко всем директориям, указав значение
open_basedir = none

2 Это можно сделать в настройках Апача
Открываем файл настроек (в зависимости от хостинга и настроек сервера) httpd.conf
vhost.conf
vhost_ssl.conf
httpd.conf
default.tpl для Vesta
для ISPmanager4 нужно править:
/usr/local/etc/apache22/httpd.conf если используете FreeBSD
/etc/httpd/apache.conf если операционка Debian
/etc/apache/conf/apache.conf если ОС CentOS
для ISPmanager5 правим в:
/etc/apache2/vhosts/пользователь/доменное имя сайта
и для параметра
php_admin_value open_basedir
устанавливаем значение none

Решение 2 ⇒ отменяем / отключаем open_basedir в файле PHP.ini

3 Отключить ( закомментировать строку ):

в файле PHP.ini или в одном из вариантов вида: PHP-5.6_php.ini

! Внимание! НО
➡ этот вариант быстрый, но не безопасный,
Поэтому, переходим к ➡

Решение 3 ⇒ отменяем ограничения в доступе для некоторых папок

4 Не отключаем PHP функцию open_basedir, а добавляем в разрешённые нужные вам папки, например
если ошибки указывают на папку /language/, добавим её в список папок к которым доступ разрешён.

Делается это так:
В настройках Apache ищем строку
php_admin_value open_basedir
и добавляем нужную нам директорию через двоеточие
Например /usr/lib/php:/usr/local/lib/php:/home/user_account/:/usr/lib/php:/usr/local/lib/php:/tmp:/new_directory/:/new_directory/
Для локального windows сервера эти настройки будут немного другими (точка с запятою вместо двоеточия)
open_basedir = C:\Windows\TEMP;E:\htdocs\localhost\js_kampre\plugins\system\nrframework\language\

Решение 4 для случая ⇒ JFolder::create: Path not in open_basedir paths

или в русскоязычном варианте:

Решение 4 для случая ⇒ JFolder::create: Путь не в пределах значения переменной open_basedir

или ещё вариант:

Решение 4 для случая ⇒ JFolder::create: Не удалось создать каталог, Внимание! Не удалось переместить файл!

5 Причина ошибки JFolder::create: Path not in open_basedir paths Unable to create destination более простая и банальная. Возникает при попытке установить компонент, модуль. Она возникает после переноса или перезда сайта на другой сервер / хостинг и связана с неверно прописанным в конфиге (configuration.php) путем к папке TEMP ( например на локали это будет так public $tmp_path = ‘E:\\htdocs\\localhost\\js_kampre/tmp’; , а на сервере хостинга public $tmp_path = ‘/var/www/. /data/www/vash-sait.ru/tmp’; ).

6 Проверить всё ли хорошо с вашими настройками после перезда сайта на другой хостинг можно в панели Администратора.

Система >> Информация о системе, вкладка «Права доступа на каталоги», найдите папки:
/tmp (Каталог для временных файлов)
/logs (Каталог файлов лога)
Проверьте для них правильность путей и прав.

Если что то не так ➡ Правим configuration.php или, что для кого то проще,
Система >> Общие настройки >>Система >> Сервер
правим
путь к каталогу временных файлов.
Сохраняем.

Если не помогло, то ➡

7 Это решение для старых версий Joomla 1.5.x
Ищем файл /libraries/joomla/filesystem/folder.php и в нём отключем / комментируем строку $obd = ini_get(‘open_basedir’);

Хотя это не самый лучший вариант решения .

8 Это решение для старых версий Joomla 1.5.x
Ищем файл /libraries/joomla/filesystem/folder.php и в нём меняем в строке
public static function create($path = », $mode = 0755)
права с 0755 на 0770

Если не получилось, то ➡

9 Проверяем архив, который вы ставите. Там может быть неверная или вложенная папка с файлами.
Распаковываем — проверяем. Перезапаковываем архив и устанавливаем снова.

Если не сработало, то ➡

10 Закачиваем установочные файлы не со своего компьютера, как это делается обычно, а с директории tmp в корневой папке Joomla. (Этот вариант много раз «спасал» )
Другими словами: сначала закачиваем нужные файлы со своего компьютера в директорию /tmp/ и затем Установку расширения производим выбирая в настройках
Установить из каталога
и там пусть такого вида /var/www/. /data/www/vash-sait.ru/tmp/

Разумеется, каталог /tmp/ должен быть доступен на запись! (как и другие каталоги, в которые новое дополнение будет устанавливаться )

11 Если вы используете на своём сайте RSFirewall, то он создаёт или пытается создать свой собственный php.ini настройки open_basedir и изменить configuration.php, поэтому RSFirewall тоже может создавать дополнительные ограничения. Подробнее

Ни что не помогло ? ➡

12 Проверяем, на всякий случай, файл .htaccess в корне сайта. Там могут быть указаны дополнительные настройки для open_basedir. Проверяем их и правим

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *