最近因为修复全站的sql注入漏洞,搞的焦头乱额。
尽管日志中能够看到错误,但是因为日志中错误描述非常简单,经常是 sql query fail之类简单描述,既没有详细回溯,也没有sql具体语句。因为是线上代码,不可能一步步追溯,这时候debug_backtrace 就非常有用了。
先来看下代码,怎么用的。
public static function fatal($msg, $file = null, $line = null) { $path = ''; $debug = debug_backtrace(); if(is_array($debug)){ $debug = array_slice($debug,1); $pathArr = array(); foreach($debug as $trace ){ $pathArr[] = $trace['class'].":".$trace['function']; } $path = implode(" <-- ",$pathArr); } $traceObj = self::getInstance(); $traceObj->_trace($msg." path:".$path, self::$ERROR, $file, $line); }
我只是使用了这个方法的文件追溯。
官方文档:
debug_backtrace — 产生一条回溯跟踪(backtrace) 说明 array debug_backtrace ([ int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT [, int $limit = 0 ]] ) debug_backtrace() 产生一条 PHP 的回溯跟踪(backtrace)。 参数 options 截至 5.3.6,这个参数是以下选项的位掩码: debug_backtrace() 选项 DEBUG_BACKTRACE_PROVIDE_OBJECT 是否填充 "object" 的索引。 DEBUG_BACKTRACE_IGNORE_ARGS 是否忽略 "args" 的索引,包括所有的 function/method 的参数,能够节省内存开销。 在 5.3.6 之前,仅仅能使用的值是 TRUE 或者 FALSE,分别等于是否设置 DEBUG_BACKTRACE_PROVIDE_OBJECT 选项。 limit 截至 5.4.0,这个参数能够用于限制返回堆栈帧的数量。 默认为 (limit=0) ,返回所有的堆栈帧。 返回值 返回一个包含众多关联数组的 array。 以为为有可能返回的元素: 有可能从 debug_backtrace() 返回的元素 名字 类型 说明 function string 当前的函数名,参见: __FUNCTION__。 line integer 当前的行号。参见: __LINE__。 file string 当前的文件名。参见: __FILE__。 class string 当前 class 的名称。参见 __CLASS__ object object 当前的 object。 type string 当前调用的类型。如果是一个方法,会返回 "->"。如果是一个静态方法,会返回 "::"。 如果是一个函数调用,则返回空。 args array 如果在一个函数里,这会列出函数的参数。 如果是在一个被包含的文件里,会列出包含的文件名。
大家可以自行尝试。
这个一般用来调试用哦,不建议线上使用,我这是迫不得已,修复完漏洞,已经去除。