深圳市一览网络股份有限
公司
ShenZhen Elanw Network
Co.,Ltd.
地址:南山科技园南区数字技术园
B2 栋 4A
Add: Room A,4th Floor,Block
B2,Digi-Tech Park ,
电话(Tel):0755-86133725
传真(Fax):0755-22632616
网址
(Web):www.YL1001.com
本文详细介绍
PHP set_error_handler()函数
的使用方法,最后还提供了一个实例
我们写程序,难免会有问题(是经常会遇到问题
),而 PHP 遇到错误时,就会给出出错脚本的位置、行
数和原因。有很多人说,这并没有什么大不了。确实,在调试程序阶段,这确实是没啥的,而且我认为给
出错误路径是必要的。
但泄露了实际路径的后果是不堪设想的,对于某些入侵者,这个信息可是非常重要,而事实上现在有很
多的服务器都存在这个问题。有些网管干脆把
PHP 配置文件中的 display_errors 设置为 Off 来解决(貌似我
们就是这样做的),但本人认为这个方法过于消极。
有些时候,我们的确需要
PHP 返回错误的信息以便调试。而且在出错时也可能需要给用户一个交待,甚至
导航到另一页面。那么,有啥解决办法呢?
set_error_handler()
PHP 从 4.1.0 开始提供了自定义错误处理句柄的功能函数 set_error_handler(),但很少数脚本编写者知道 。
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
)
{
//如果不是管理员就过滤实际路径
if
(!admin)
{
$errfile
=
str_replace
(
getcwd
(),"",
$errfile
);
$errstr
=
str_replace
(
getcwd
(),"",
$errstr
);
}
switch
(
$errno
)
{
case
E_ERROR:
echo
"ERROR: [ID $errno] $errstr (Line: $errline of $errfile) \n";
echo
"程序已经停止运行,请联系管理员。";
//遇到 Error 级错误时退出脚本
exit
;
break
;