9

我有一个带有数十个虚拟主机的专用服务器。我想确定哪个文件正在调用 mail() 函数并在全局范围内记录它。我需要这样的东西:

[Wed Feb 13 10:42:39 2013] mail() called from /var/www/example1.php on line 70
[Wed Feb 13 10:42:40 2013] mail() called from /var/www/example2.php on line 70

我不能使用 debug_backtrace() 或类似的,因为我不能将它添加到服务器中的任何 PHP 文件中。我可以将所有函数调用全局记录在一个文件中,比如将错误记录到 error.log 之类的文件中吗?

谢谢

4

4 回答 4

3

一般来说,你会遇到麻烦;PHP 不提供内置的日志记录机制,因此您需要在 PHP 系统中添加一些内容才能做到这一点。

我看到的选项:

  1. 修改 PHP 代码。鉴于您在问题中所说的话,我想这不是一个选择,但需要说明,因为这是显而易见的答案。(PHP 的mail()功能是如此基础,以至于任何编写 PHP 代码的人都应该为它使用包装类,以保持他们的理智)

  2. 如果我们专门讨论该mail()函数,那么我们可以通过记录mail()调用的 sendmail 客户端来记录它。服务器sendmail上的系统可能由 PHPmail()函数调用的 unix shell 脚本控制。您应该能够修改此 shell 脚本以记录邮件事件。这可能无法为您提供行号等详细信息,但它会告诉您正在执行此操作的用户等。

  3. 使用Suhosin PHP 加固补丁。这是一个针对 PHP 的补丁,提供了数十种与安全相关的功能;无论如何,我强烈推荐它用于共享托管环境。但对您而言,它还包括日志记录功能,这可能允许您记录特定函数的使用情况,包括文件名和行号——即正是您正在寻找的场景。这是我推荐的解决方案....您在这里遇到的唯一大问题是您是否将 PHP 版本保持在最新状态,因为 Suhosin 目前仅适用于 PHP 5.3,而不是 5.4。作为一名 PHP 开发人员,我会努力在我的服务器上安装 PHP 5.4,但作为提供者,5.3 仍然受支持,所以它没有任何问题。(另一方面,如果您仍在使用 5.2,则应该尽快升级,因为它多年来一直不受支持并且存在已知的安全漏洞)。

于 2013-02-13T10:18:17.857 回答
3

从 >= PHP 5.3.0 开始,您可以简单地在以下位置指定您的 logilfe 所需位置的路径php.ini

mail.log = /path/to/some/logfile

有关详细信息,请参阅PHP 文档

于 2015-12-08T21:57:54.527 回答
0

你可以做的是,下载 php 源代码,编辑这个文件:

ext/standard/mail.c

并在那里添加记录器。

然后重新编译。

这可能是您可以隐式调试谁从哪里调用您的 php 函数的唯一方法。

于 2013-02-13T10:22:12.933 回答
0

要阻止 mail(),只需从 php 的 chroot 中删除 /usr/sbin/sendmail 并强制验证 smtp。

于 2014-11-06T23:49:07.223 回答