2012-04-21 44 views
0

如何在嘗試包含/需要php文件時打印自定義錯誤?試圖包含/需要時的自定義錯誤

這是我的想法:

<?php 

try{ 
    include "template/".$_GET['view'].".php"; 
} 
catch (Exception $e){ 
    echo 'some error code'; 
}; 

?> 

但是,我依然得到默認的錯誤,如果所需的文件不存在。

+2

爲什麼如果文件包括前第一存在不檢查。如果它不存在,請輸出您的自定義錯誤。 – Blake 2012-04-21 18:58:21

+0

最好的解決方案是使用適當的錯誤處理語言。 – ThiefMaster 2012-04-21 18:59:47

+3

您還需要對'$ _GET ['view']'進行一些理智檢查。否則有人可以使用例如'view = ../../../../somewhere/evil.file%00'包含另一個文件 - 可能是包含惡意代碼的用戶上傳的文件。 – ThiefMaster 2012-04-21 19:00:48

回答

4

決定的意見是值得改變的回答:

使用file_exists(),看文件是否存在。

如果有,包含,否則回顯您的自定義錯誤消息。

+0

兩個字:[race condition](http://stackoverflow.com/questions/34510/what-is-a-race-condition)。這不是你的錯,但PHP真的需要它的遊戲! – 2012-04-21 19:14:28

1

使用file_exists()來檢查文件是否在包含之前。這樣你可以處理錯誤。

<?php 

if(file_exists('asd.php')){ 
    include "asd.php"; 
}else{ 
    echo "Oh no! The file doesn't exist!"; 
} 

?> 
1

包含錯誤不會被try/catch抓住,但是,我相信包含腳本中的錯誤會被正確捕獲。更好的解決方案是使用文件存在功能,請參閱此文章的示例:Optional include in PHP

一旦您對文件的存在執行自己的驗證,您可以將執行代碼包裝在try catch中以確保錯誤在那個代碼被捕獲。

1

我不會推薦只使用file_exist。你不想讓你的訪問者訪問你的文件系統上的任何文件,所以我會推薦一個白名單;如果文件名在白名單中,則只顯示/包含它。

1
if ((include "template/".$_GET['view'].".php") != 'OK') { 
    echo "My custom error message"; 
} 
0

如果你想自己的錯誤消息,你可以做這樣的:

<?php 
$file = "template/".$_GET['view'].".php"; 
if (error_reporting() == 0){ 
    (@include_once($file)) OR die("<tt><p><b>ERROR</b> $file file not found!</p>"); 
}else{ 
    require_once($file); 
} 
?> 

所以,如果沒有錯誤報告(如productiv環境大部分時間),你可以打印自己的錯誤消息。如果您處於開發模式(ans error_reporting已開啓),您將獲得PHP錯誤消息!

提示切勿使用$ _GET來自用戶的輸入直接用於包括 - 這是一個黑色的XSS漏洞:d

相關問題