非常奇怪的PHP包括行为..

时间:2012-05-25 06:18:22

标签: php include cross-domain

包含php文件时,我遇到了一些非常奇怪的行为。
我需要加载一个脚本,该脚本与将调用它的页面不在同一个域中。

我已经创建了一个使用cURL工作的系统,但我最近发现许多需要访问此脚本的站点没有安装cURL。 但是,我注意到这些网站allow_url_fopen设置为on。凭借这些知识,我开始创建一个新系统,让我只需将脚本包含在远程站点上。

只是对此进行测试,我将脚本test.php编码如下:

<?php 
echo("test");
?>

我使用以下命令在远程页面上包含此脚本:

<?php
include("http://mydomain.com/script.php");
?>

它没有问题,页面顶部印有“test”。

但是,如果我向脚本添加一个函数并尝试从页面调用该函数,它就会崩溃 更糟糕的是,这个网站关闭了PHP错误,我无法打开它。

为了完全确保我没有弄乱代码,我让test.php看起来像这样:

<?php
function myfunc()
{
return "abc";
}
?>

然后在包含文件的页面上:

<?php 
include("http://mydomain.com/script.php");
echo(myfunc());
?>

它崩溃了。 任何想法都将不胜感激。

3 个答案:

答案 0 :(得分:0)

这不是奇怪的行为,但由于您通过互联网加载文件(请注意万维网),该文件在发送到您的包含功能之前会被解释。

由于脚本被解释,因此不会看到任何函数,只会看到脚本的输出。

通过FTP加载或为函数创建API。

答案 1 :(得分:0)

我的猜测:mydomain.com的网络服务器对http://mydomain.com/script.php的PHP 解释。您只有including是该脚本的结果。对于一个简单的echo("test"),那就是“测试”。函数不会产生任何输出,也不会对including脚本可用。只需在浏览器中访问http://mydomain.com/script.php即可确认这一点,看看您收到了什么。您需要阻止mydomain.com实际解释PHP文件并将其作为纯文本返回。

但是:这听起来不错。跨域包含是反模式。它不仅可以解决您的安全问题,而且还会使每个页面加载速度变得非常慢。如果跨域包含是答案,那么你的问题是错误的。

答案 2 :(得分:0)

您要包含test.php的客户端输出,而不是服务器端源代码。将test.php重命名为test.phpc以防止执行脚本。但是出于安全考虑,这是危险的。