set_error_handler這個函數的作用是為了防止錯誤路徑洩露
何為錯誤路徑洩露呢?
我們寫程式,難免會有問題(是經常會遇到問題

),而PHP遇到錯誤時,就會給出出錯腳本的位置、行數和原因
有很多人說,這并沒有什麼大不了。确實,在調試程式階段,這确實是沒啥的,而且我認為給出錯誤路徑是必要的。
但洩露了實際路徑的後果是不堪設想的,對于某些入侵者,這個資訊可是非常重要,而事實上現在有很多的伺服器都存在這個問題。
有些網管幹脆把PHP配置檔案中的display_errors設定為Off來解決(貌似我們就是這樣做的),但本人認為這個方法過于消極。
有些時候,我們的确需要PHP傳回錯誤的資訊以便調試。而且在出錯時也可能需要給使用者一個交待,甚至導航到另一頁面。
那麼,有啥解決辦法呢?
PHP從4.1.0開始提供了自定義錯誤處理句柄的功能函數set_error_handler(),但很少數腳本編寫者知道。
set_error_handler的使用方法如下:
現在我們就用自定義的錯誤處理把實際路徑過濾掉。
如:假設有一個變量$admin,我們是用來判斷通路者是否是管理者的(可以通過IP或者登入的使用者id來做這個判斷)
這樣就自定義了一個錯誤處理函數,那麼怎麼把錯誤的處理交給這個自定義函數呢?
so easy,這樣,就可以很好地解決安全和調試友善的沖突了。而且你還可以花點心思,使錯誤提示更加美觀以配合網站的風格。
原作者給出了兩點需要注意的地方,我也放出來吧,希望引起廣大同胞們的注意:
E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、 E_COMPILE_ERROR、E_COMPILE_WARNING是不會被這個句柄處理的,也就是會用最原始的方式顯示出來。不過出現這些錯誤都是編 譯或PHP核心出錯,在通常情況下不會發生。 使用set_error_handler()後,error_reporting ()将會失效。也就是所有的錯誤(除上述的錯誤)都會交給自定義的函數處理。
最後,原作者又給出了一個示例(真是個認真負責的好人哈。呵呵)
嗯,根據上面的那些解釋,以及原作者認真負責的态度,我想如果我還學不會這個set_error_handler函數,那麼我真該去撞牆了。
好了,總結一下,下面是 set_error_handler 三種用法: