Как ограничить приложения PHP их собственными каталогами и собственным php.ini?

Я запускаю несколько приложений PHP на своем Mac, работая под управлением OS X 10.5.6, Apache 2, PHP 5. У меня есть настройки поддоменов для каждого проекта, записи файла хоста для каждого поддомена и блоки виртуального каталога в конфигурации Apache. Так

project1.localhost переходит в /Library/WebServer/Documents/Project1
project2.localhost переходит в /Library/WebServer/Documents/Project2
и т. д.

Однако этот метод на самом деле не «изолирует» веб-приложения. Например, если я включу такой скрипт:

<?php
include("/includes/include.php");
?>

Он ссылается на сценарий из базового каталога моего компьютера. Таким образом, он обращается к
C:/includes/include.php.

Есть ли способ сделать его ссылкой
C:/Library/WebServer/Documents/Project2/includes/include.php

По сути, сделайте так, чтобы он не знал ничего за пределами своего собственного каталога. Кроме того, есть ли способ использовать php.ini для каждого субдомена?


person John B    schedule 12.03.2009    source источник


Ответы (6)


Я считаю, что можно установить php.ini для каждого виртуального хоста.

<VirtualHost *:80>
    ...

    PHPINIDir /full/path/to/php/ini/

</VirtualHost>

таким образом вы можете настроить open_basedir и другие

person J.C. Inacio    schedule 12.03.2009
comment
Что ты имеешь в виду под этим можно настроить open_basedir и другие. Является ли open_basedir параметром INI? - person John B; 20.03.2009
comment
да, и поэтому использование 'php_admin_value open_basedir/path' также работает - person J.C. Inacio; 20.03.2009

Вы можете ограничить возможность скриптов видеть что-либо выше определенного дерева папок, добавив open_basedir блок папок в файле httpd.conf. Это должно выглядеть так:

‹КАТАЛОГ /полный/путь/к/папке/содержащей/скрипт/›

php_admin_value open_basedir /полный/путь/к/верхней/папке/из/желаемого/дерева/

‹/КАТАЛОГ›

Одна вещь - если вы не заканчиваете путь символом /, то это совпадение с подстановочным знаком. Другими словами, /var/etc/my будет соответствовать /var/etc/myFolder, а также /var/etc/myMothersFolder, а /var/etc/my/ будет соответствовать только этому точному имени папки.

person user13414    schedule 12.03.2009
comment
Я еще не пробовал это, но есть ли какие-либо предостережения при использовании этого метода? - person John B; 20.03.2009
comment
Предостережения? Как что? С директивой open_basedir или с помещением директивы в файл httpd.conf? - person user13414; 20.03.2009
comment
Я не нашел каких-либо ошибок, которые явно не упомянуты в документах. - person user13414; 20.03.2009

Что касается изоляции приложений, это связано с защитой PHP-скриптов, чтобы они не могли получить доступ к другим? Пожалуйста, дополните -

Что касается php.ini - я не знаю, как использовать конкретный php.ini для каждого каталога, но вы, безусловно, можете создать страницу включения php с кучей строк ini_set(), возможно, что-то вроде этого.

<?php
  // in your header or along top of all php modules in your pap
  require_once ( '/path/to/includes/ini_set.php' );

  // ...

?>

и скрипт ini_set.php:

<?php
  // one of these for each override of defaults set in php.ini file --
  ini_set ( $varname, $newvalue );
  ini_set ( $varname, $newvalue );
  ini_set ( $varname, $newvalue );
?>

Если вам интересно узнать больше о функции ini_set(), вот страница документации на php.net: http://us3.php.net/ini_set

Надеюсь, это было чем-то полезно ~

person OneNerd    schedule 12.03.2009
comment
Я думал о том, чтобы работать над несколькими приложениями одновременно, а не использовать для всех один и тот же INI. Я также хочу иметь возможность легко перемещать приложения в Linux или Windows без повторного создания всей структуры каталогов, потому что в моих включениях есть абсолютные пути. - person John B; 20.03.2009
comment
Есть ли проблемы с производительностью при установке значений PHP INI при загрузке КАЖДОЙ страницы? - person John B; 20.03.2009

Лучший способ сделать это — использовать PHP через FCGI (mod_fcgid). Таким образом, вы можете запускать PHP, используя другого пользователя и другой php.ini для каждого виртуального хоста.

Вот пример того, как настроить такую ​​конфигурацию в Ubuntu: http://www.howtoforge.com/how-to-set-up-apache2-with-mod_fcgid-and-php5-on-ubuntu-8.10

person maff    schedule 15.03.2009
comment
Я посмотрю на это, если я не могу найти другой метод. Спасибо! - person John B; 20.03.2009

Если вы хотите использовать полное имя пути, вы можете использовать его:

<?php
include  dirname( __FILE__ ) . '/includes/include.php';
?>

Возможное решение для файла php.ini

person Luc M    schedule 12.03.2009
comment
Согласно документации PHP. При использовании внутри включения возвращается имя включенного файла. Так что это тоже не очень полезно, если включение включает другие файлы. - person John B; 12.03.2009

Попробуйте относительный путь! Нравиться:

<?php
include("./includes/include.php");
?>

or

<?php
include("includes/include.php");
?>
person Martin K.    schedule 12.03.2009
comment
То есть точка заставляет переходить на поддомены DocumentRoot? - person John B; 12.03.2009
comment
. всегда является текущим каталогом! - person Martin K.; 12.03.2009
comment
Но на самом деле это мне не помогает... Мне нужно включить файлы на основе каталога roto ПОДДОМЕНА. Если у меня есть сценарии на пять уровней глубже корня поддомена, то я не могу использовать текущий каталог в качестве начальной точки включения. Верно? - person John B; 12.03.2009