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

StackOverflow https://stackoverflow.com/questions/639666

Вопрос

Я запускаю несколько 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 для каждого поддомена?

Это было полезно?

Решение

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

<VirtualHost *:80>
    ...

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

</VirtualHost>

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

Другие советы

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

<DIRECTORY full="" path="" to="" folder="" containing="" script="" />

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

</DIRECTORY>

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

Относительно изоляции приложения ~ это касается защиты 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

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

Лучший способ сделать это - использовать 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

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

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

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

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

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

или

<?php
include("includes/include.php");
?>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top