如何在嘗試包含/需要php文件時打印自定義錯誤?試圖包含/需要時的自定義錯誤
這是我的想法:
<?php
try{
include "template/".$_GET['view'].".php";
}
catch (Exception $e){
echo 'some error code';
};
?>
但是,我依然得到默認的錯誤,如果所需的文件不存在。
如何在嘗試包含/需要php文件時打印自定義錯誤?試圖包含/需要時的自定義錯誤
這是我的想法:
<?php
try{
include "template/".$_GET['view'].".php";
}
catch (Exception $e){
echo 'some error code';
};
?>
但是,我依然得到默認的錯誤,如果所需的文件不存在。
兩個字:[race condition](http://stackoverflow.com/questions/34510/what-is-a-race-condition)。這不是你的錯,但PHP真的需要它的遊戲! – 2012-04-21 19:14:28
使用file_exists()
來檢查文件是否在包含之前。這樣你可以處理錯誤。
<?php
if(file_exists('asd.php')){
include "asd.php";
}else{
echo "Oh no! The file doesn't exist!";
}
?>
包含錯誤不會被try/catch抓住,但是,我相信包含腳本中的錯誤會被正確捕獲。更好的解決方案是使用文件存在功能,請參閱此文章的示例:Optional include in PHP
一旦您對文件的存在執行自己的驗證,您可以將執行代碼包裝在try catch中以確保錯誤在那個代碼被捕獲。
我不會推薦只使用file_exist
。你不想讓你的訪問者訪問你的文件系統上的任何文件,所以我會推薦一個白名單;如果文件名在白名單中,則只顯示/包含它。
if ((include "template/".$_GET['view'].".php") != 'OK') {
echo "My custom error message";
}
如果你想自己的錯誤消息,你可以做這樣的:
<?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
爲什麼如果文件包括前第一存在不檢查。如果它不存在,請輸出您的自定義錯誤。 – Blake 2012-04-21 18:58:21
最好的解決方案是使用適當的錯誤處理語言。 – ThiefMaster 2012-04-21 18:59:47
您還需要對'$ _GET ['view']'進行一些理智檢查。否則有人可以使用例如'view = ../../../../somewhere/evil.file%00'包含另一個文件 - 可能是包含惡意代碼的用戶上傳的文件。 – ThiefMaster 2012-04-21 19:00:48