Как ограничить приложения PHP своими каталогами и собственным php.ini? - PullRequest
6 голосов
/ 12 марта 2009

Я использую несколько приложений PHP на моем Mac, работаю под управлением OS X 10.5.6, Apache 2, PHP 5. У меня есть настройка поддоменов для каждого проекта, записи файла хоста для каждого субдомена и блоки Virtual Directory в конфигурации 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 для отдельных поддоменов?

Ответы [ 6 ]

8 голосов
/ 13 марта 2009

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

<VirtualHost *:80>
    ...

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

</VirtualHost>

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

4 голосов
/ 12 марта 2009

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

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

php_admin_value open_basedir "/ full / path / to / top / folder / of / требуемое / tree /"

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

1 голос
/ 16 марта 2009

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

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

1 голос
/ 13 марта 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

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

0 голосов
/ 12 марта 2009

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

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

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

0 голосов
/ 12 марта 2009

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

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

или

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