set error handler 重要用法

2021-09-08 16:18:32 字數 2801 閱讀 5140

set_error_handler這個函式的作用是為了防止錯誤路徑洩露

何為錯誤路徑洩露呢?

我們寫程式,難免會有問題(是經常會遇到問題

有很多人說,這並沒有什麼大不了。確實,在除錯程式階段,這確實是沒啥的,而且我認為給出錯誤路徑是必要的。

但洩露了實際路徑的後果是不堪設想的,對於某些入侵者,這個資訊可是非常重要,而事實上現在有很多的伺服器都存在這個問題。

有些網管乾脆把php配置檔案中的display_errors設定為off來解決(貌似我們就是這樣做的),但本人認為這個方法過於消極。

有些時候,我們的確需要php返回錯誤的資訊以便除錯。而且在出錯時也可能需要給使用者乙個交待,甚至導航到另一頁面。

那麼,有啥解決辦法呢?

php從4.1.0開始提供了自定義錯誤處理控制代碼的功能函式set_error_handler(),但很少數指令碼編寫者知道。

set_error_handler的使用方法如下:

string set_error_handler ( callback error_handler [, int error_types])
現在我們就用自定義的錯誤處理把實際路徑過濾掉。

如:假設有乙個變數$admin,我們是用來判斷訪問者是否是管理員的(可以通過ip或者登入的使用者id來做這個判斷)

//admin為管理員的身份判定,true為管理員。  

//自定義的錯誤處理函式一定要有這4個輸入變數$errno,$errstr,$errfile,$errline,否則無效。

function my_error_handler($errno,$errstr,$errfile,$errline)

switch($errno)

}

這樣就自定義了乙個錯誤處理函式,那麼怎麼把錯誤的處理交給這個自定義函式呢?

// 應用到類  

//示例的做法

set_error_handler("my_error_handler");

so easy,這樣,就可以很好地解決安全和除錯方便的矛盾了。而且你還可以花點心思,使錯誤提示更加美觀以配合**的風格。

原作者給出了兩點需要注意的地方,我也放出來吧,希望引起廣大同胞們的注意:

e_error、e_parse、e_core_error、e_core_warning、 e_compile_error、e_compile_warning是不會被這個控制代碼處理的,也就是會用最原始的方式顯示出來。不過出現這些錯誤都是編 譯或php核心出錯,在通常情況下不會發生。

使用set_error_handler()後,error_reporting ()將會失效。也就是所有的錯誤(除上述的錯誤)都會交給自定義的函式處理。

最後,原作者又給出了乙個示例(真是個認真負責的好人哈。呵呵)
//先定義乙個函式,也可以定義在其他的檔案中,再用require()呼叫  

function myerrorhandler($errno, $errstr, $errfile, $errline)

/* don't execute php internal error handler */

return true;

}

//下面開始連線mysql伺服器,我們故意指定mysql埠為3333,實際為3306。

$link_id=@mysql_pconnect("localhost:3333","root","password");

set_error_handler(myerrorhandler);

if (!$link_id)

嗯,根據上面的那些解釋,以及原作者認真負責的態度,我想如果我還學不會這個set_error_handler函式,那麼我真該去撞牆了。

好了,總結一下,下面是 set_error_handler 三種用法:

class callbackclass   

function staticfunction()

}

function nonclassfunction($errno, $errstr, $errfile, $errline)

// 三種方法如下:

1: set_error_handler('nonclassfunction'); // 直接轉到乙個普通的函式 nonclassfunction

2: set_error_handler(array('callbackclass', 'staticfunction')); // 轉到 callbackclass 類下的靜方法 staticfunction

/*第乙個引數為陣列,類名、方法名*/

3: $o =& new callbackclass(); //位址引用

set_error_handler(array($o, 'callbackfunction')); // 轉到類的建構函式,其實本質上跟下面的第四條一樣。

4. $o = new callbackclass();

// the following may also prove useful:

class callbackclass

function callbackfunction()

}

關於 do while 的重要用法

關於 do while 的重要用法 在實際的程式設計練習中迴圈語句的使用頻率是 for while do.while 當然推薦使用的也是上面的順序,但是在有的地方 do.while 用的卻不是迴圈 的功能了,比如說 do while 0 此處,一般是不會去使用 do.while 語句的迴圈功能的,此...

建構函式使用要點以及重要用法

c 所有型別除了object都有父類,如果類在編碼時沒有寫父類,那麼在編譯時 編譯器會預設繼承object,這就是為什麼我們自己寫的類沒有繼承object卻可以用object類的方法 例如tostring 子類建構函式中,先呼叫父類的建構函式,子類建構函式的引數傳遞到父類建構函式中,因為建構函式和析...

Django的forms包部分重要用法

1 from django.forms import fields 2from django.forms import form 3from django.forms import widgets 在views匯入 匯入包之後,定義乙個繼承自form的類並定義用於驗證的字段 1 class test...