我有以下问题:我有一个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时,我会得到一个页面结果,所以这不是没有访问权限的问题,对吗?
这可能是什么问题?为什么常量应该是全局的,而不是从远程服务器包含时“继承”?
答案 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_fopen
和allow_url_include
只能在php.ini或httpd.conf中设置。本地服务器阻止文件被包含,这与在浏览器中键入URL不同。
为什么常量应该是全局的,而不是“继承的” 什么时候从远程服务器包括?
即使外部包含有效,它也无法按预期工作。包含的HTTP与标准包含的不同。
您正在包含所包含文件的输出。外部PHP文件在被包含之前在外部服务器上处理。
如果可以通过这种方式逐字阅读外部PHP文件,那肯定是一个安全漏洞。
答案 3 :(得分:0)
不通常建议使用外部包含。
它们通常不能很好地工作(或根本不能)。
所以不要使用外部包含。