2

我有以下问题:我得到了一个 PHP 文件 ( standards.php),其中包含如下语句:

define('CONSTVAR', '/path/');

现在,我有另一个名为 的文件untitled.php,其中包含:

include ('standards.php');
echo CONSTVAR;

这将导致页面/path/显示常量的值。

到目前为止还不错。

但是当我把它standards.php放在我的另一个网站上并尝试从那里包含它(使用include('http://mysite.eu/core/standards.php');命令)时,它不起作用。常量保持为空,我也收到以下错误

警告:main(http://mysite.eu/core/standards.php)[function.main]:无法打开流:第 28 行 /home/www/this.nl/core/untitled.php 中的权限被拒绝

警告:main() [function.include]: 未能打开 'http://mysite.eu/core/standards.php' 以包含 (include_path='.:/usr/local/php4/lib/php') home/www/this.nl/core/untitled.php 在第 28 行

allow_url_include也已启用allow_url_fopen。当我在standards.php浏览器中输入完整的 URL 时,我会得到一个页面结果,所以这不是没有访问权限的问题,对吧?

这里可能是什么问题?为什么从远程服务器包含的常量应该是全局的,而不是“继承的”?

4

4 回答 4

7

您通常不能通过包装器include来自远程主机的 PHP 文件,HTTP因为当您的 PHP 解析器请求包含时,它要么找不到文件(include用于包含来自本地文件系统的具有绝对或相对路径的文件),要么远程 Web 服务器发送它不是源代码,而是一个解析的 PHP 文件,就像它会发送到浏览器一样。并include获取源代码。

更多信息,取自手动输入include()

警告。安全警告:

远程文件可以在远程服务器上处理(取决于文件扩展名和远程服务器是否运行 PHP 的事实),但它仍然必须生成有效的 PHP 脚本,因为它将在本地服务器上处理。如果来自远程服务器的文件应该在那里处理并仅输出,则使用 readfile() 函数要好得多。否则,应特别注意保护远程脚本以生成有效且所需的代码。

于 2012-08-06T14:09:24.040 回答
4
function cthulhu_include($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $code = curl_exec($ch);

    eval($code);

    curl_close($ch);
}

交付。还要确保您有例如 .txt(纯文本)文件而不是 .php(已处理的纯文本)文件(因为您将得到空白输出),这样每个人都可以在此过程中看到您的代码。

于 2012-08-06T14:13:45.233 回答
2

Allow_url_include 已启用,allow_url_fopen 也已启用。当我在浏览器中输入standards.php 的完整网址时,我会得到一个页面结果,所以这不是没有访问权限的问题,对吧?

allow_url_fopen并且allow_url_include只能在 php.ini 或 httpd.conf 中设置。阻止包含文件的是本地服务器,这与在浏览器中键入 URL 不同。

为什么从远程服务器包含的常量应该是全局的,而不是“继承的”?

即使外部包含工作,它也不会按预期工作。HTTP 上的包含不同于标准包含。

您正在包括包含文件的输出。外部 PHP 文件在被包含之前在外部服务器上进行处理。

如果可以通过这种方式逐字读取外部 PHP 文件,那肯定是一个安全漏洞。

于 2012-08-06T14:08:40.387 回答
0

通常建议使用外部包含。

它们通常不能很好地工作(或根本不能)。

所以不要使用外部包含。

于 2012-08-06T14:04:54.587 回答