0

包含 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());
?>

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

4

3 回答 3

0

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

由于脚本被解释,所以没有函数可见,而只有脚本的输出。

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

于 2012-05-25T06:23:05.740 回答
0

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

于 2012-05-25T06:28:46.870 回答
0

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

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

于 2012-05-25T06:25:34.523 回答