2012-08-06 41 views
2

我有如下因素的問題時:我有這樣的語句的PHP文件(standards.php):常量不是「填充」,包括從遠程服務器的PHP文件

define('CONSTVAR', '/path/'); 

現在,我已經叫另一個文件untitled.php,包含此:

include ('standards.php'); 
echo CONSTVAR; 

這將導致一個頁面,指出/path/,常量的值。

目前爲止還不錯。

但是,當我將standards.php放在另一個我的網站上並試圖從那裏包含它(使用include('http://mysite.eu/core/standards.php');命令)時,它不起作用。常數保持爲空,並且我也收到以下錯誤

警告:main(http://mysite.eu/core/standards.php)[function.main]:無法打開流:權限被拒絕/home/www/this.nl/core/untitled.php on line 28

Warning:main()[function.include]:打開'http://mysite.eu/core/standards.php'失敗夾雜物(包含路徑= ':在/ usr /本地/ PHP4/LIB/PHP')在/home/www/this.nl/core/untitled.php線路28上

allow_url_include啓用和allow_url_fopen太。當我在瀏覽器中輸入standards.php的完整URL時,我得到一個頁面結果,所以它不是沒有訪問權限的問題,對吧?

這裏有什麼問題?爲什麼常量應該是全局的,在從遠程服務器包含時不會「繼承」?

+2

問題不在於常量,而在於外部'include'。當然包含失敗,所以文件不是* include * -ed。 – 2012-08-06 14:03:47

+0

哈.....我剛剛看到這個評論。 'upped'^_^ – Neal 2012-08-06 14:05:16

+0

您收錄的文件包含什麼內容? 它有PHP標籤嗎? 您必須回顯您需要的內容。如果您在PHP標記中定義了常量,則不會到達其他服務器。 只需訪問網頁瀏覽器的include文件即可查看返回結果 – 2012-08-06 14:03:38

回答

2

Allow_url_include is enabled and allow_url_fopen too。當我在我的瀏覽器中輸入完整的網址standard.php的 時,我得到一個頁面結果,所以 它不是一個沒有訪問權限的問題,對吧?

allow_url_fopenallow_url_include只能在php.ini或httpd.conf中進行設置。這是本地服務器阻止文件被包含,這與在瀏覽器中輸入URL不同。

爲什麼從遠程服務器中包含常量時,應該是全局的,而不是「繼承」 ?

即使外部包含工作,它也不會按預期工作。包括HTTP在內的不同於標準。

您正在包括包含文件的輸出。外部PHP文件在被包含之前在外部服務器上處理。

如果可以通過這種方式逐字讀取外部PHP文件,那肯定會有安全漏洞。

+0

allow_url_fopen和allow_url_include被啓用,但我知道遠程服務器首先處理php文件?這是一個可惜.. 它仍然奇怪,它給了我一個權限被拒絕的錯誤,即使要包含的文件可以在瀏覽器中打開.. – 2012-08-06 15:25:36

+0

@BobHasgould:「權限被拒絕錯誤」是來自本地PHP服務器的警告消息。本地服務器配置中有一些阻止了這一點。該請求甚至沒有通過外觀到達遠程服務器。直接在瀏覽器中指定文件顯然是繞過了任何本地PHP服務器。 (我使用'local'這個術語來指代你發出請求的源服務器,它可能是本地的,也可能不是本地的。) – MrWhite 2012-08-06 16:07:28

0

這是不是通常建議使用外部包括。

他們通常不能很好地工作(或根本不工作)。

所以不要使用外部包含。

+0

因此,他們**不能**你在說什麼? – 2012-08-06 14:05:17

+0

@WesleyMurch他們可以,如果包含的文件是原始的PHP。但如果PHP頁面已經翻譯,那麼它將**不**工作。 – Neal 2012-08-06 14:06:33

+0

對不起,「生PHP」?我非常肯定你可以「包含」任何類型的文件,也許你應該充實你的答案。編輯:好的,我明白你的意思了,但在你的回答中沒有很好的解釋。 – 2012-08-06 14:07:16

7

您可以從遠程主機在HTTP包裝通常不include PHP文件,因爲當你的PHP解析器請求包括,它要麼未能找到該文件(include用於包括從本地文件系統具有絕對或相對路徑的文件) ,或者遠程網絡服務器發送的不是源代碼,而是像解析PHP文件一樣發送給瀏覽器。並include採取源代碼。

有關詳細信息,從include()手動輸入採取:

警告。安全警告:

遠程文件可能會在遠程服務器上進行處理(具體取決於文件擴展名以及遠程服務器是否運行PHP)但它仍然必須生成有效的PHP腳本,因爲它將被處理在本地服務器上。如果來自遠程服務器的文件應該在那裏處理並僅輸出,那麼readfile()函數要好得多。否則,應特別注意確保遠程腳本生成有效的代碼。

4
function cthulhu_include($url) 
{ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

    $code = curl_exec($ch); 

    eval($code); 

    curl_close($ch); 
} 

交付。還要確保你有例如.txt(純文本)文件而不是.php(處理過的純文本)(因爲你會得到空白輸出),這樣每個人都可以在這個過程中看到你的代碼。

+0

我喜歡你的函數名。但是我仍然會警告@BobHasgould不要依賴遠程包含,更不要說泄漏的'eval()'命令。從外部來源加載腳本沒有意義。那麼......那裏**是**,但只有依靠它才能做到,否則更好。 – Whisperity 2012-08-06 14:32:12

+0

不,沒有意義通過HTTP加載它。如果他不想聽(已經給出了很多建議),那麼他會從他的錯誤中吸取教訓。希望他會改變他的建築(如果有的話)。 – 2012-08-06 14:36:27

+0

我知道這不是一個「理想的架構」,它不是一個永久的解決方案,它只是一個實驗! 不知道上面的代碼應該做什麼,但它不會導致任何結果。我包含的代碼是一個php文件,並且這個因素不能改變。 – 2012-08-06 16:28:12