PHP set_error_handler()函数的使用,phpseterrorhandler
我们写程序,难免会有问题(是经常会遇到问题 ),而PHP遇到错误时,就会给出出错脚本的位置、行数和原因。有很多人说,这并没有什么大不了。确实,在调试程序阶段,这确实是没啥的,而且我认为给出错误路径是必要的。
但泄露了实际路径的后果是不堪设想的,对于某些入侵者,这个信息可是非常重要,而事实上现在有很多的服务器都存在这个问题。有些网管干脆把PHP配置文件中的display_errors设置为Off来解决(貌似我们就是这样做的),但本人认为这个方法过于消极。
有些时候,我们的确需要PHP返回错误的信息以便调试。而且在出错时也可能需要给用户一个交待,甚至导航到另一页面。
那么,有啥解决办法呢?
set_error_handler()
PHP从4.1.0开始提供了自定义错误处理句柄的功能函数set_error_handler(),但很少数脚本编写者知道。set_error_handler这个函数可以很好地防止错误路径泄露,当然还有其它更多的作用。
set_error_handler的使用方法如下:
<span>string</span> set_error_handler ( callback error_handler [, <span>int</span> error_types])
现在我们就用自定义的错误处理把实际路径过滤掉。假设有一个变量$admin,我们是用来判断访问者是否是管理员的(可以通过IP或者登录的用户id来做这个判断)
<span>//</span><span>admin为管理员的身份判定,true为管理员。 </span><span>//</span><span>自定义的错误处理函数一定要有这4个输入变量$errno,$errstr,$errfile,$errline,否则无效。</span> <span> function my_error_handler($errno,$errstr,$errfile,$errline) { </span><span>//</span><span>如果不是管理员就过滤实际路径 </span> <span>if</span>(!<span>admin) { $errfile</span>=str_replace(getcwd(),<span>""</span><span>,$errfile); $errstr</span>=str_replace(getcwd(),<span>""</span><span>,$errstr); } </span><span>switch</span><span>($errno) { </span><span>case</span><span> E_ERROR: echo </span><span>"</span><span>ERROR: [ID $errno] $errstr (Line: $errline of $errfile) \n</span><span>"</span><span>; echo </span><span>"</span><span>程序已经停止运行,请联系管理员。</span><span>"</span><span>; </span><span>//</span><span>遇到Error级错误时退出脚本 </span> <span>break</span><span>; </span><span>case</span><span> E_WARNING: echo </span><span>"</span><span>WARNING: [ID $errno] $errstr (Line: $errline of $errfile) \n</span><span>"</span><span>; </span><span>break</span><span>; </span><span>default</span><span>: </span><span>//</span><span>不显示Notice级的错误 </span> <span>break</span><span>; } } </span>
这样就自定义了一个错误处理函数,那么怎么把错误的处理交给这个自定义函数呢?
<span>//</span><span> 应用到类 </span> set_error_handler(array(&$<span>this</span>,<span>"</span><span>appError</span><span>"</span><span>)); </span><span>//</span><span>示例的做法 </span> set_error_handler(<span>"</span><span>my_error_handler</span><span>"</span>);
so easy,这样,就可以很好地解决安全和调试方便的矛盾了。而且你还可以花点心思,使错误提示更加美观以配合网站的风格。
原作者给出了两点需要注意的地方,我也放出来吧,希望引起广大同胞们的注意:
<span>//</span><span>先定义一个函数,也可以定义在其他的文件中,再用require()调用 </span> <span>function myErrorHandler($errno, $errstr, $errfile, $errline) { </span><span>//</span><span>为了安全起见,不暴露出真实物理路径,下面两行过滤实际路径 </span> $errfile=str_replace(getcwd(),<span>""</span><span>,$errfile); $errstr</span>=str_replace(getcwd(),<span>""</span><span>,$errstr); </span><span>switch</span><span> ($errno) { </span><span>case</span><span> E_USER_ERROR: echo </span><span>"</span><span><b>My ERROR</b> [$errno] $errstr<br />\n</span><span>"</span><span>; echo </span><span>"</span><span> Fatal error on line $errline in file $errfile</span><span>"</span><span>; echo </span><span>"</span><span>, PHP </span><span>"</span> . PHP_VERSION . <span>"</span><span> (</span><span>"</span> . PHP_OS . <span>"</span><span>)<br />\n</span><span>"</span><span>; echo </span><span>"</span><span>Aborting...<br />\n</span><span>"</span><span>; exit(</span><span>1</span><span>); </span><span>break</span><span>; </span><span>case</span><span> E_USER_WARNING: echo </span><span>"</span><span><b>My WARNING</b> [$errno] $errstr<br />\n</span><span>"</span><span>; </span><span>break</span><span>; </span><span>case</span><span> E_USER_NOTICE: echo </span><span>"</span><span><b>My NOTICE</b> [$errno] $errstr<br />\n</span><span>"</span><span>; </span><span>break</span><span>; </span><span>default</span><span>: echo </span><span>"</span><span>Unknown error type: [$errno] $errstr<br />\n</span><span>"</span><span>; </span><span>break</span><span>; } </span><span>/*</span><span> Don't execute PHP internal error handler </span><span>*/</span> <span>return</span> <span>true</span><span>; } </span><span>//</span><span>下面开始连接MYSQL服务器,我们故意指定MYSQL端口为3333,实际为3306。 </span> $link_id=@mysql_pconnect(<span>"</span><span>localhost:3333</span><span>"</span>,<span>"</span><span>root</span><span>"</span>,<span>"</span><span>password</span><span>"</span><span>); set_error_handler(myErrorHandler); </span><span>if</span> (!<span>$link_id) { trigger_error(</span><span>"</span><span>出错了</span><span>"</span><span>, E_USER_ERROR); } </span>
好了,总结一下,下面是 set_error_handler 三种用法:
<span>class</span><span> CallbackClass { function CallbackFunction() { </span><span>//</span><span> refers to $this </span> <span> } function StaticFunction() { </span><span>//</span><span> doesn't refer to $this </span> <span> } } function NonClassFunction($errno, $errstr, $errfile, $errline) { } </span><span>//</span><span> 三种方法如下: </span> <span>1</span>: set_error_handler(<span>'</span><span>NonClassFunction</span><span>'</span>); <span>//</span><span> 直接转到一个普通的函数 NonClassFunction </span> <span>2</span>: set_error_handler(array(<span>'</span><span>CallbackClass</span><span>'</span>, <span>'</span><span>StaticFunction</span><span>'</span>)); <span>//</span><span> 转到 CallbackClass 类下的静方法 StaticFunction </span> <span>3</span>: $o =& <span>new</span><span> CallbackClass(); set_error_handler(array($o, </span><span>'</span><span>CallbackFunction</span><span>'</span>)); <span>//</span><span> 转到类的构造函数,其实本质上跟下面的第四条一样。 </span> <span>4</span>. $o = <span>new</span><span> CallbackClass(); </span><span>//</span><span> The following may also prove useful: </span> <span>class</span><span> CallbackClass { function CallbackClass() { set_error_handler(array(</span>&$<span>this</span>, <span>'</span><span>CallbackFunction</span><span>'</span>)); <span>//</span><span> the & is important </span> <span> } function CallbackFunction() { </span><span>//</span><span> refers to $this </span> <span> } } </span>

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SublimeText3汉化版
中文版,非常好用

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。