非常奇怪的php包含行为



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

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

只是测试一下,我test.php编写脚本如下:

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

我使用以下方法将此脚本包含在远程页面上:

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

它工作没有问题,"测试"打印在页面顶部。

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

为了完全确保我不只是弄乱了代码,我让我的test.php看起来像这样:

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

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

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

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

这不是奇怪的行为,但由于您通过互联网加载文件(在本例中注意万维网),因此在将文件发送到包含函数之前会对其进行解释。

由于脚本是解释的,因此不会显示任何函数,而只会显示脚本的输出。

要么

通过FTP加载它,要么为函数创建一个API。

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

但是:这听起来像是一个坏主意。跨域包含是一种反模式。它不仅会给您带来安全问题,还会使每个页面加载速度不必要地变慢。如果跨域包含是答案,那么您的问题就错了。

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

相关内容

  • 没有找到相关文章

最新更新