2012-08-06 40 views
2

我有如下因素的问题时:我有这样的语句的PHP文件(standards.php):常量不是“填充”,包括从远程服务器的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 on line 28

Warning:main()[function.include]:打开'http://mysite.eu/core/standards.php'失败夹杂物(包含路径= ':在/ usr /本地/ PHP4/LIB/PHP')在/home/www/this.nl/core/untitled.php线路28上

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

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

+2

问题不在于常量,而在于外部'include'。当然包含失败,所以文件不是* include * -ed。 – 2012-08-06 14:03:47

+0

哈.....我刚刚看到这个评论。 'upped'^_^ – Neal 2012-08-06 14:05:16

+0

您收录的文件包含什么内容? 它有PHP标签吗? 您必须回显您需要的内容。如果您在PHP标记中定义了常量,则不会到达其他服务器。 只需访问网页浏览器的include文件即可查看返回结果 – 2012-08-06 14:03:38

回答

2

Allow_url_include is enabled and allow_url_fopen too。当我在我的浏览器中输入完整的网址standard.php的 时,我得到一个页面结果,所以 它不是一个没有访问权限的问题,对吧?

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

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

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

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

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

+0

allow_url_fopen和allow_url_include被启用,但我知道远程服务器首先处理php文件?这是一个可惜.. 它仍然奇怪,它给了我一个权限被拒绝的错误,即使要包含的文件可以在浏览器中打开.. – 2012-08-06 15:25:36

+0

@BobHasgould:“权限被拒绝错误”是来自本地PHP服务器的警告消息。本地服务器配置中有一些阻止了这一点。该请求甚至没有通过外观到达远程服务器。直接在浏览器中指定文件显然是绕过了任何本地PHP服务器。 (我使用'local'这个术语来指代你发出请求的源服务器,它可能是本地的,也可能不是本地的。) – MrWhite 2012-08-06 16:07:28

0

这是不是通常建议使用外部包括。

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

所以不要使用外部包含。

+0

因此,他们**不能**你在说什么? – 2012-08-06 14:05:17

+0

@WesleyMurch他们可以,如果包含的文件是原始的PHP。但如果PHP页面已经翻译,那么它将**不**工作。 – Neal 2012-08-06 14:06:33

+0

对不起,“生PHP”?我非常肯定你可以“包含”任何类型的文件,也许你应该充实你的答案。编辑:好的,我明白你的意思了,但在你的回答中没有很好的解释。 – 2012-08-06 14:07:16

7

您可以从远程主机在HTTP包装通常不include PHP文件,因为当你的PHP解析器请求包括,它要么未能找到该文件(include用于包括从本地文件系统具有绝对或相对路径的文件) ,或者远程网络服务器发送的不是源代码,而是像解析PHP文件一样发送给浏览器。并include采取源代码。

有关详细信息,从include()手动输入采取:

警告。安全警告:

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

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(处理过的纯文本)(因为你会得到空白输出),这样每个人都可以在这个过程中看到你的代码。

+0

我喜欢你的函数名。但是我仍然会警告@BobHasgould不要依赖远程包含,更不要说泄漏的'eval()'命令。从外部来源加载脚本没有意义。那么......那里**是**,但只有依靠它才能做到,否则更好。 – Whisperity 2012-08-06 14:32:12

+0

不,没有意义通过HTTP加载它。如果他不想听(已经给出了很多建议),那么他会从他的错误中吸取教训。希望他会改变他的建筑(如果有的话)。 – 2012-08-06 14:36:27

+0

我知道这不是一个“理想的架构”,它不是一个永久的解决方案,它只是一个实验! 不知道上面的代码应该做什么,但它不会导致任何结果。我包含的代码是一个php文件,并且这个因素不能改变。 – 2012-08-06 16:28:12