3

関数が呼び出された場所を見つける方法を考えています。問題は、PHPがmail()関数を呼び出している場所を見つける必要があることです。1つの方法はを使用することregister_tick_function()ですが、各ファイルを開いて、各行の内容を確認する必要があります。プロジェクトは巨大で、PHPで各ファイルを解析するのに非常に長い時間がかかります。その他の方法で?mail()または、関数をオーバーライドする方法を選択しますか?

4

5 に答える 5

6

組み込みのメール関数をオーバーライドするには、 Advanced PHP Debugger PECL拡張機能の一部であるoverride_functionを確認してください。次に、 debug_backtraceを使用 して呼び出し元の詳細を確認できます...

//define code to override mail function (note I've used php5.3 nowdoc syntax to avoid 
//the need to escape the dollar symbols!!
$code=<<<'CODE'
    $trace=debug_backtrace();
    $caller=array_shift($trace);

    echo 'mail() called by '.$caller['function']
    if (isset($caller['class']))
        echo 'in '.$caller['class'];
CODE;

//install override
override_function('mail', '$to,$subject,$msg,$hdrs,$params', $code);
于 2010-01-14T09:19:41.627 に答える
3

でスタックトレースを調べることができますdebug_backtrace()。これには、特に呼び出し元のメソッド/関数に関する情報が含まれます。例については、マニュアルを参照してください。

既存の関数に動作を追加するには、関数を独自の関数またはクラスにラップしてから、ネイティブ関数の代わりにこれを呼び出します。

ネイティブ関数を完全に再定義するには、をインストールする必要がありますrunkit。次に、実行できますrunkit_redefine_function()(または、他の場所で提案されているようにAPDを使用します)。

プロジェクトのどこで呼び出されたかを知りたいだけの場合mail()、たとえば実行時にこれを評価する必要がない場合は、IDEの検索機能を使用します。Eclipse、Zend Studio、およびNetbeansはファイル検索を実行できるため、呼び出しを見つけて置き換えるのも非常に簡単です。

于 2010-01-14T09:19:36.960 に答える
2

総当たり攻撃のアプローチは、グローバル検索を実行してコードを置き換え、「mail \ s(」を「my_mail(」に置き換えてから、my_mailを定義し、必要なログ機能をそこに配置することです。

于 2010-01-14T09:23:39.567 に答える
1

ソースで「mail(」を検索してみませんか?

于 2010-01-14T09:24:42.550 に答える
0

ソースコードにアクセスできると思いますか?

jEditのようなエディターを使用して、開いているすべてのバッファーですべてのmail(*)を検索してみませんか?

それとも、実行時に行番号を本当に知る必要がありますか?あなたが実際にそうしているとは想像できません。

于 2010-01-14T09:25:27.340 に答える