从远程服务器包含PHP文件时,常量不会“填充”

时间:2012-08-06 13:53:27

标签: php include const remote-server

我有以下问题:我有一个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]:无法打开流:/home/www/this.nl/core/untitled.php中的权限被拒绝第28行

     

警告: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 个答案:

答案 0 :(得分:7)

您通常include来自远程主机的PHP文件不能通过HTTP包装器,因为当PHP解析器请求包含时,它无法找到文件(include用于包含来自具有绝对或相对路径的本地文件系统的文件),或者远程Web服务器不是将源代码发送给它,而是将它发送到浏览器的解析后的PHP文件。 include需要源代码。

有关详细信息,请参阅include()的手册输入:

  

警告。安全警告:

     

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

答案 1 :(得分: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(已处理的纯文本)(因为您将获得空白输出),这样每个人都可以在此过程中看到您的代码。

答案 2 :(得分:2)

  

Allow_url_include已启用且allow_url_fopen也已启用。当我输入   将standards.php的完整url放入我的浏览器,我得到一个页面结果,所以   这不是没有访问权限的问题,对吗?

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

  

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

即使外部包含有效,它也无法按预期工作。包含的HTTP与标准包含的不同。

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

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

答案 3 :(得分:0)

通常建议使用外部包含。

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

所以不要使用外部包含。