基于一些非常有用的提示,我使用以下代码将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会怎么样....如何编写代码呢?我这样做有些困难,我的目标是我不想在代码中填写实际的文字目录,我想避免文件遍历攻击
答案 0 :(得分:5)
考虑这个项目结构:
/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中的"magic" constants之一,因此:
的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]这是一个糟糕的主意。它有效,但不要这样做。
答案 1 :(得分:-1)
要获取public_html上面的目录,我使用以下
$ aboveRoot = explode('/ public_html',$ _SERVER ['DOCUMENT_ROOT']);
define('ABOVE_THE_ROOT',$ aboveRoot [0]);