2

問題が発生したときにスタック トレースを出力するのが好きです。debug_backtrace を使用して PHP で簡単に実行できます。ただし、問題は、ファイルのアップロードや画像のアップロードなどで問題が発生すると、トレースの一部として巨大なバイナリ ファイルが取得されることです。このように:(切り捨てられた)

 #webgloo_ajax_error_handler() called at :0
1175 array (
1176   0 => 256,
1177   1 => 'Image_upload_error',
1178   2 => '/home/rjha/code/github/sc/webgloo/lib/com/indigloo/media/ImageUpload.php',
1179   3 => 95,
1180   4 =>
1181   array (
1182     'prefix' => 'test/2012/04/08/',
1183     'fieldName' => '120444-LM_menu_button.png',
1184     'sBlobData' => '<89>PNG^M
1185 ^Z
1186 ' . "\0" . '' . "\0" . '' . "\0" . '^MIHDR' . "\0" . '' . "\0" . '' . "\0" . 'P' . "\0" . '' . "\0" . '' . "\0"      . '^^^H^F' . "\0" . '' . "\0" . '' . "\0" . '»C<99>±' . "\0" . '' . "\0" . '' . "\0" . '^AsRGB' . "\0" . '®Î^\é'      . "\0" . '' . "\0" . '' . "\0" . '^FbKGD' . "\0" . 'ÿ' . "\0" . 'ÿ' . "\0" . 'ÿ ½§<93>' . "\0" . '' . "\0" . ''      . "\0" . ' pHYs' . "\0" . '' . "\0" . '^K<88>' . "\0" . '' . "\0" . '^K<88>^Aå<8e>)I' . "\0" . '' . "\0" . '' .      "\0" . '^GtIME^GÚ^B^R^V 5$=fÞ' . "\0" . '' . "\0" . '^PEIDAThÞÝ<9a>û<8f>]WuÇ?k<9f>sgl<8f>Ç<89>íøAH^P8<89>±<9d>8

理想的には、そのようなバイナリ ブロブをバック トレースから削除したいと考えています。PHPでバイナリ文字列を確実に検出する方法はありますか?

以下は私にとってはうまくいきませ。主な理由は、解決策を徹底的にしたいからです。

  1. 名前に基づくフィルタリング (除外 .PNG など)
  2. 各データピース内の魔法の「数字」を探す

これが私の現在のバックトレースジェネレーターです

function backtrace() {
            fwrite($this->fhandle," ---- __backtrace__  ----- \n" );
            $trace = debug_backtrace();
            $message = '' ;

            foreach ($trace as $i=>$t) {
                $message = sprintf("#%d %s%s%s() called at %s:%d \n", 
                    $i,$t['class'], $t['type'],$t['function'],$t['file'],$t['line']);
                fwrite($this->fhandle,$message);

                $args = $t['args'];

                if(!empty($args)) {
                    //remove blob strings from Argument
                    Util::unsetInArray($args,array('sBlobData','tBlobData'));
                    $this->dump($args);
                }
            }

        }
4

0 に答える 0