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

I am experiencing some very strange behavior when including a PHP file.
I need to load a script that is not on the same domain as the page that will be calling it.

I have already created a system that works using cURL, but I just recently found out that many of the sites that will need to have access to this script, do not have cURL installed. I did, however, notice that these sites have allow_url_fopen set to on. With this knowledge I got started creating a new system that would let me just include the script on the remote site.

Just testing this out, I coded the script test.php as follows:

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

我将这个脚本包含在远程页面上,使用:

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

and it works no problem and "test" is printed at the top of the page.

However, if I add a function to the script and try to call the function from the page, it crashes.
To make it worse, this site has PHP errors turned off and I have no way of turning it on.

To fully make sure that I didn't just mess up the code, I made my test.php look like this:

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

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

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

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

0
额外
意见: 1

3 答案

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

But: this sounds like a bad idea to begin with. Cross-domain includes are an anti-patterns. Not only does it open you up to security problems, it also makes every page load unnecessarily slow. If cross-domain inclusions is the answer, your question is wrong.

0
额外
可能的漏洞包括:首先,根据定义,您所包含的代码是公开可见的。我不知道你在使用这种技术,但通常人们会试图在服务器上保持某些文件“秘密”,在这种情况下,它具有完全相反的效果。其他漏洞攻击:针对将请求重定向到 mydomain.com 的其他服务器的DNS攻击,方便地允许任意代码注入。或者首先劫持 mydomain.com 服务器。
额外 作者 deceze,
仅仅增加的延迟就会使这不是一个可行的解决方案。其他细节只是添加更多的减点。我不知道最终文件中会包含什么,但是无论您想要 include ,它都需要通过HTTP以明文形式传输,并且任何人都可以简单地转到URL以查看将要包含的代码。制作只传输所需数据的API(如果有的话)。
额外 作者 deceze,
取决于你想要用卷曲来做什么。不要用它来通过'net'获取和执行任意代码,不管你使用 include 还是curl都不重要。
额外 作者 deceze,
是的,这一定是问题所在。我意识到,跨域包含并不是一个好主意,但我很难看到它在我的情况下如何被利用。调用我的脚本的服务器与仅在浏览器中加载脚本的人之间有什么区别?从我可以告诉的是,最重要的是,首先将allow_url_fopen设置为开启,而我并没有这样做。客户端已经在他们的服务器上有这个设置。我确实看到它如何使网页加载速度比平常慢。谢谢你的帮助!
额外 作者 Scott Haley,
如果我能够保留这个特定脚本的任何“秘密”,该怎么办?该脚本将从MySQL数据库中提取信息,但是如果我将代码连接到单独的文件中的数据库并将其包含在脚本中,那么这些信息是否仍然隐藏?除了直接连接到我的数据库的信息以外,脚本所提供的信息绝不是“秘密”,也不会对任何人有用。 DNS的独立性足以让这不是一个可行的解决方案吗?
额外 作者 Scott Haley,
好吧,我会承认打败并放弃使用这种方法。 :P使用cURL执行此操作有任何问题吗?还是有什么我需要小心使用这样的卷曲?
额外 作者 Scott Haley,
我将传递我的服务器用来从数据库中提取信息并发回的变量。
额外 作者 Scott Haley,

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

0
额外

这不是奇怪的行为,但是因为你通过互联网(在这种情况下是万维网)加载文件,文件在发送到你的包含函数之前被解释。

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

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

0
额外
啊,好吧,这是有道理的。我将研究创建一个API。谢谢!
额外 作者 Scott Haley,