2009-09-23 52 views
-1

我不是PHP开发人员,但我目前正在使用内部工具进行黑客攻击,因此我的团队可以利用其优点。有一个索引文件,如下所示:维护URL字符串的PHP变量

require(($loader_path = "../../loaderapi/") . "loader.php"); 

像这样使用,$ loader_path将在loader.php文件中保留其值。

但是,我们想从我们团队的服务器来访问这个API,像这样:

require(($loader_path = "http://remoteservername/loaderapi/") . "loader.php"); 

在这种情况下,$ loader_path变量不会保留它的价值。我猜这与它是一个完整的URL有关,但我可能是错的。关于如何做这项工作的任何想法,或者我为什么不能这样做?

+0

你的* loader.php *提供了什么,你需要从远程服务器包含它? – Gumbo 2009-09-23 14:29:55

+0

这是一个我们希望集中在一个内部服务器上的工具,用于多个不同的团队(和团队服务器)在他们自己的应用程序中使用这些功能。 – Fostah 2009-09-23 14:34:33

回答

3

如果您通过HTTP访问一个PHP脚本,只返回该脚本的输出。因此,您的脚本将尝试解释该远程PHP脚本的输出,而不是它的源代码。

如果在文件系统的连接,你可能想尝试file://remoteservername/loaderapi/loader.php代替。

+0

我修改了我之前的评论,你完全正确;在我匆忙中,我误解了“包含”功能。重要的一点是:'远程文件可以在远程服务器上处理(取决于文件扩展名和远程服务器是否运行PHP),但它仍然必须生成有效的PHP脚本,因为它会在本地服务器上进行处理......应特别注意确保远程脚本生成有效和期望的代码。 – 2009-09-23 14:36:24

+0

由于没有文件系统连接,这不适合我的需要。 – Fostah 2009-09-23 14:48:46

-1

你试过它分成两行:

$loader_path = "http://remoteservername/loaderapi/"; 
require($loader_path . "loader.php"); 

它更易于阅读这种方式为好。

+0

这可能比较干净,但在我所遇到的行为中没有任何区别。 – Fostah 2009-09-23 14:39:02

+0

按照你的问题解决了这个问题...... $ loader_path被保留 – NDM 2009-09-23 14:44:48

+0

你确定'loader.php'不包含改变$ loader_path的代码吗? – 2009-09-23 14:47:10

-1

通过简单地把一切在3线简化代码阅读:

$loader_path = "http://remoteservername/loaderapi/"; 
$page = "loader.php"; 
require($loader_path . $page); 

更清晰,它的工作原理。

+0

这可能比较干净,但我在遇到的行为没有任何区别。 – Fostah 2009-09-23 14:37:40

+0

downvoting一堆问题不会帮助你有完美的答案。你的答案标题不好。你应该询问远程问题而不是维护。 – 2009-09-23 15:55:38

-1

为什么不把它放在require语句之上呢?会使阅读起来更容易。

<?php 
    $loader_path = "../../folderName/" 
    require($loader_path . "filename") 
?> 
+0

相对路径不是问题。 – Fostah 2009-09-23 14:36:31

0

两者之间不应该有任何实质性区别;你正在做的是定义$ loader_path,连接loader.php,并将其传递给require。

但是:您定义的要求范围,这将阻止脚本的处理都需要失败中的变量。

尝试更换“需要”与“包括”,看看它是否保留了变量。

另外请注意,如果你运行的是Windows机器上你的PHP服务器,PHP版本低于4.3.0,既不是“需要”和“包括”可以处理远程文件:http://us.php.net/manual/en/function.include.php

而且如前所述,如果.php位于解析php的远程服务器上,您将无法获取代码,而是由远程服务器处理代码的结果。你将不得不把它作为一个.txt文件来提供,或者编写php,当处理时输出有效的php。

+0

我不知道截断版本,但** PHP默认情况下禁用远程文件包含**。 – dcousineau 2009-09-23 14:40:18

+0

更改为包含没有帮助。而且,我使用Apache 2.2运行PHP 5.2.10。 – Fostah 2009-09-23 14:41:51

+0

@dcousineau我在我的php.ini文件中启用了allow_url_fopen和allow_url_include。我没有问题,包括文件,因为我可以从loader.php文件中回显$ loader_path变量的值,无论我设置$ loader_path为什么。它只是一个URL时不会保留其价值。 – Fostah 2009-09-23 14:45:05

0

NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO!

远程文件包含是一个坏主意,可能是最大的安全缺陷之一,你可以打开。即使是内部工具,即使仅仅是为了造成不良习惯,这也是不可接受的。

PHP在默认情况下禁用此行为,并有广阔的推动有执行从PHP完全剥离的URL 一个包括能力(因为没有令人信服的理由有这个能力)。

如果要装载共享资源,经过一个共享文件系统驱动器(如,不使用httpftp,任何东西,但file://)或更好的通过版本控制系统分发loader.php副本。从单个文件资源加载会导致您面临将来发生的问题,例如说新开发人员覆盖loader.php并破坏其他人的代码。

+0

我不同意,我不问是否是好的做法。也许这是一个安全缺陷,但它不是私人服务器上的问题,并且在每次主API调整时,群发让一群团队同步以进行同步毫无意义。 – Fostah 2009-09-23 14:47:48

+0

然后共享驱动器是您的最佳解决方案。我会高度建议相信核心PHP团队,整个社区和整个软件安全行业的智慧,并找到一个真正的,长期稳定的解决方案,而不是一个可怕的肮脏的黑客攻击。但这是你的葬礼。 – dcousineau 2009-09-23 14:53:42

+0

不过,你的偏题。这就像我把我的汽车交给技工,他告诉我我的问题是我没有开一辆美国汽车。给我一个适合我的范围的解决方案,或者不要回应。 – Fostah 2009-09-23 15:04:19