2012-07-08 50 views
1

基於一些非常有用的提示,我使用以下代碼將PHP文件包含在我的根目錄之外,其外觀與此類似:如何使用include返回public_html根文件public_html

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文件引導然後有自己的代碼行包括一個文件BACK在public_html根文件夾....如何將代碼呢?我有一些困難,這樣一來,在這裏我的目標是,我不希望把實際的字面目錄全部代碼和我想避免文件遍歷攻擊

+0

如果您不想使用絕對路徑,一種方法是在「外部」腳本中定義一個變量,然後將其用於包含的「內部腳本」中。例如:'include_prefix = ;'在外部腳本中,'if(isset('include_prefix')){include($ include_prefix。「」); ''在bootstrap.php中。然而,如果安全性和可靠性受到嚴重關注,我認爲絕對路徑是最好的方法。 – jedwards 2012-07-08 14:43:29

+0

對不起,我應該澄清我相信我有的麻煩是,而不是簡單地能夠去包括(「thatfilebackinrootdirectory.php」);例如,它工作...它給我一個錯誤,說沒有這樣的文件或目錄,我假設,因爲我已經從根目錄上去了一個目錄,它現在不知道如何從它的位置引用到public_html php文件? – Kalcoder 2012-07-08 14:45:18

+0

你對錯誤出現的原因是正確的。在那裏有很多解決方案 - 我會在一秒內回答更多細節。 – jedwards 2012-07-08 14:46:23

回答

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在評論中指出,你可以使用"magic" constants這裏的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]這是一個可怕的想法。它有效,但不要這樣做。

+0

還有其他建議嗎? – Kalcoder 2012-07-09 05:35:38

+0

那麼@jedwards是否意味着4種方法中的示例1是所有4種解決方案中最不受歡迎的? – Kalcoder 2012-07-09 06:23:15

+0

@Kalcoder:我會說3是最不受歡迎的。 1通常用於較小的項目,並且能夠完美地工作(如果路徑正確)。 2比1更容易維護,但它們在功能上是相同的。 – jedwards 2012-07-12 18:19:37

-1

要獲得上面的目錄public_html我使用以下
$ aboveRoot = explode('/ public_html',$ _SERVER ['DOCUMENT_ROOT']);
define('ABOVE_THE_ROOT',$ aboveRoot [0]);

+0

我接受這是一個糟糕/差的答案。我只是想知道爲什麼? – George 2012-07-08 15:25:15

+0

沒關係我會堅持提問。 – George 2012-07-08 15:40:15

+0

嗯,我總是很好奇,並且思想開放。我想每個人都會從我猜的答案中受益。 @George,我正在做這個這個......我是我的public_html,我去了一個,我進入另一個文件夾,讓我們打電話給這個文件夾蝙蝠俠,我去蝙蝠俠,我想要包括一個文件thats在public_html,所以無論如何,我需要返回到public_html,而不冒任何安全漏洞,使人們無論如何都可以遍歷或破解它 – Kalcoder 2012-07-09 05:48:18

相關問題