【问题标题】:How do I limit PHP apps to their own directories and their own php.ini?如何将 PHP 应用程序限制在它们自己的目录和它们自己的 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?

【问题讨论】:

    标签: php apache include subdomain server-side-includes


    【解决方案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

    【讨论】:

    • 如果找不到其他方法,我会调查一下。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-01-02
    • 2021-06-25
    • 2011-08-01
    • 2014-09-16
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多