1

基于一些非常有用的提示,我正在使用以下代码来包含PHP我的根目录之外的文件,这些文件看起来与此类似:

define('WEB_ROOT', __DIR__);
define('APP_ROOT', dirname(__DIR__));
define('PHP_ROOT', APP_ROOT . DIRECTORY_SEPARATOR . 'application');


include(PHP_ROOT . DIRECTORY_SEPARATOR . 'bootstrap.php');

我的问题是这个,例如,您可以根据bootstrap.php上面的内容包含代码。

如果该PHP文件引导程序有自己的代码行,在 public_html 根文件夹中包含一个文件 BACK 怎么办......如何编写代码?我在执行此操作时遇到了一些困难,我的目标是我不想将实际的文字目录完整地放入代码中,并且我想避免文件遍历攻击

4

2 回答 2

5

考虑这个项目结构:

/path/to/projectroot/index.php
                     头文件.php
                     包括/inc.php

如果 index.php 有

include('include/inc.php');

和inc.php有

include('header.php');

你会得到那个错误,因为 inc.php 中的行会寻找

/path/to/projectroot/include/header.php(不存在)

不是

/path/to/projectroot/header.php(确实存在)

人们有几种方法可以解决这个问题。

1:绝对路径

第一个也是最直接的方法是使用绝对路径。

如果 index.php 有

include('include/inc.php');

和inc.php有

include('/path/to/projectroot/header.php');

这会奏效。

2:带定义的绝对路径

类似于#1,如果 index.php 有

define('PROJECT_ROOT', '/path/to/projectroot/');
include(PROJECT_ROOT.'include/inc.php');

和inc.php有

include(PROJECT_ROOT.'header.php');

这会奏效。

更新:pichan评论中所述,您可以在 index.php 中使用“神奇”常量之一,因此:

索引.php

define('PROJECT_ROOT', __DIR__.'/');
include(PROJECT_ROOT.'include/inc.php');

和inc.php

include(PROJECT_ROOT.'header.php');

请注意,我们在此处添加了一个斜杠,__DIR__因为:

此目录名称没有尾部斜杠,除非它是根目录。

3:同时包含并隐藏错误

如果 inc.php 有

@include('header.php');    # Try this directory
@include('../header.php'); # Try parent directory

这会奏效。 [1]

4:除非另有说明,否则假定当前目录

如果 index.php 有

$rel_prefix_to_root = '../';
include('include/inc.php');

和inc.php有

if(!isset($rel_path_to_root)){ $rel_path_to_root = ''; }
include($rel_path_to_root . 'header.php');

这会奏效。

我对这些方法的看法

1 和 2 基本相同,但是 2 对于大型项目来说更容易和更常见,因为它允许您进行一个常量定义并在站点范围内使用它。它还允许您将项目部署在多个服务器上(放置在多个路径中),并且只需要在项目范围内更改一行,而不是选项 1 的每个文件中的一行。

3 太可怕了,别这样。有时您会看到它,您甚至可能会在在线教程中看到它。不要这样做。

可能应该避免使用 4 来支持 1 或 2。但是如果您有一些复杂的包含集,则这种方法可能是必要的。

一些注意事项:

[1] 这是一个糟糕的主意。它有效,但不要这样做。

于 2012-07-08T15:01:01.173 回答
-1

要获取 public_html 上方的目录,我使用以下
$aboveRoot = explode('/public_html', $_SERVER['DOCUMENT_ROOT']);
定义('ABOVE_THE_ROOT', $aboveRoot[0]);

于 2012-07-08T15:11:27.990 回答