如何将 PHP 应用程序限制在它们自己的目录和它们自己的 php.ini 中?
Posted
技术标签:
【中文标题】如何将 PHP 应用程序限制在它们自己的目录和它们自己的 php.ini 中?【英文标题】:How do I limit PHP apps to their own directories and their own php.ini? 【发布时间】:2010-10-12 23:38:24 【问题描述】:我在我的 Mac 上运行多个 php 应用程序,运行 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?
【问题讨论】:
【参考方案1】:尝试相对路径!喜欢:
<?php
include("./includes/include.php");
?>
或
<?php
include("includes/include.php");
?>
【讨论】:
所以点使它进入子域 DocumentRoot? “。”始终是当前目录! 但这并没有真正帮助我...我需要包含基于 SUB DOMAIN 的 roto 目录的文件。如果我在子域的根目录中有五个级别的脚本,那么我不能使用当前目录作为包含起点。对吗?【参考方案2】:如果你想使用完整的路径名,你可以使用:
<?php
include dirname( __FILE__ ) . '/includes/include.php';
?>
Possible solution for php.ini file
【讨论】:
根据 PHP 文档“如果在包含中使用,则返回包含文件的名称。”因此,在包含包含其他文件的情况下,这也没有多大帮助。【参考方案3】:您可以通过在 httpd.conf 文件中的文件夹块中添加 open_basedir 指令来限制脚本查看特定文件夹树上方的任何内容的能力。它应该看起来像:
php_admin_value open_basedir "/full/path/to/top/folder/of/desired/tree/"
目录>
有一件事 - 如果你不以 / 结束路径,那么它就是通配符匹配。换句话说,“/var/etc/my”将匹配“/var/etc/myFolder”以及“/var/etc/myMothersFolder”,而“/var/etc/my/”将只匹配那个确切的文件夹名字。
【讨论】:
我还没开始尝试这个,但是使用这个方法有什么注意事项吗? 注意事项?像什么?使用 open_basedir 指令还是将指令放在 httpd.conf 文件中? 我没有发现文档中没有明确提到的任何陷阱。【参考方案4】:关于应用程序隔离 ~ 这是否与 保护 PHP 脚本有关,以便它们无法访问其他脚本?请详细说明-
关于 php.ini - 我不知道有什么方法可以在每个目录中使用特定的 php.ini,但您当然可以创建一个包含一堆 ini_set() 行的 php 包含页面,也许是这样的 ..
<?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
希望对你有所帮助~
【讨论】:
我正在考虑同时处理多个应用程序,而不是为所有应用程序使用相同的 INI。我还希望能够轻松地将应用程序移动到 Linux 或 Windows,而不必再次重新创建整个目录结构,因为我的包含在其中具有绝对路径。 在每次页面加载时设置 PHP INI 值是否存在性能问题?【参考方案5】:我相信可以为每个虚拟主机设置一个 php.ini
<VirtualHost *:80>
...
PHPINIDir /full/path/to/php/ini/
</VirtualHost>
这样你可以自定义 open_basedir 和其他
【讨论】:
“这样你可以自定义 open_basedir 和其他”是什么意思。 open_basedir 是 INI 设置吗? 是的,这就是为什么使用 'php_admin_value open_basedir "/path"' 也有效【参考方案6】:最好的方法是通过 FCGI (mod_fcgid) 使用 PHP。这样,您可以使用不同的用户和每个 vHost 的不同 php.ini 运行 PHP。
以下是如何在 Ubuntu 上设置此类配置的示例:http://www.howtoforge.com/how-to-set-up-apache2-with-mod_fcgid-and-php5-on-ubuntu-8.10
【讨论】:
如果找不到其他方法,我会调查一下。谢谢!以上是关于如何将 PHP 应用程序限制在它们自己的目录和它们自己的 php.ini 中?的主要内容,如果未能解决你的问题,请参考以下文章