如何利用包括向后引用的public_html根文件往上走一个文件目录的public_html出来后,

2019-09-19 05:38发布

基于一些非常有用的技巧,我使用下面的代码包含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根文件夹中的文件行....怎么会一个代码是什么? 我有一些困难,这样一来,在这里我的目标是,我不希望把实际的字面目录全部代码和我想避免文件遍历攻击

Answer 1:

考虑这个项目的结构:

/path/to/projectroot/index.php
                     header.php
                     include/inc.php

如果过的index.php

include('include/inc.php');

和inc.php有

include('header.php');

你会得到这个错误,因为在inc.php行要寻找

/path/to/projectroot/include/header.php  (doesn't exist)

/path/to/projectroot/header.php (does exist)

有几个方式让人们解决这个问题。

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这里,所以:

的index.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]这是一种可怕的想法。 它的工作原理,但不这样做。



Answer 2:

为了获得上述的public_html目录我用下面的
$ aboveRoot =爆炸( '/的public_html',$ _SERVER [ 'DOCUMENT_ROOT']);
定义( 'ABOVE_THE_ROOT',$ aboveRoot [0]);



文章来源: How to refer back to public_html root file using include after going up one file directory out of public_html