5

如果无法访问 php.ini(假设 php -v >= 5.3 & mail.add_x_header = 1),或者无法修补邮件,有没有办法在使用 php 时更改 X-Php-Originating-Script 标头mail()功能?

我所做的小研究表明,$_SERVER['PHP_SELF']在调用之前进行更改mail()可以解决问题,但这对我不起作用。

我还尝试直接设置 X-Php-Originating-Script,这导致了一个额外的“X-Php-Originating-Script”标头。

在这种情况下,目标是防止所述电子邮件的收件人看到有关脚本命名法的详细信息。

谢谢!

4

3 回答 3

13

根据 PHP 手册(PHP 手册 >> 函数参考 >> 邮件相关扩展 >> 邮件 >> 安装/配置php.ini),可以使用或文件关闭标头.htaccess,这将阻止任何人在您无权访问的情况下从您的邮件标头中收集信息到您的 php.ini 文件。

关闭它的设置是:

mail.add_x_header bool

添加X-PHP-Originating-Script将包括脚本的 UID,后跟文件名。

这将使禁用它所需的实际行:

 mail.add_x_header 0

此设置使用 PHP_INI_PERDIR 模式进行标记(自 PHP 5.3.0 起可用)。PHP_INI_PERDIR 表示“可以在 php.ini、.htaccess、httpd.conf 或 .user.ini 中设置条目(自 PHP 5.3 起)。”

对于.htaccess

php_flag mail.add_x_header Off

我没有亲自测试过这个所以YMMV。

于 2014-08-05T03:02:08.463 回答
3

好吧,如果我们查看mail()函数的源代码,我们可以看到它是硬编码的:

if (headers != NULL) {
    spprintf(&hdr, 0, "X-PHP-Originating-Script: %ld:%s\n%s", php_getuid(), f, headers);
} else {
    spprintf(&hdr, 0, "X-PHP-Originating-Script: %ld:%s\n", php_getuid(), f);
}

因此,将其放入 uid 是硬编码的。但让我们看看这会把我们带到哪里。

现在,您应该了解 SAPI 基本上是不同服务器 API 与 PHP 通信的多态方式。因此,如果我们看一些 SAPI:

  • mod_php 与 Apache

    这只是返回finfoapache 传递它的构造。没有机会修改它(它不是环境变量)。它直接来自apache。所以没有运气。

  • FPM

    这甚至没有实现sapi_get_stat()。所以默认行为仍然运行(这是当前路径的基本状态)。

所以简短的回答是否定的,不修补 PHP 的核心是不可能的......

于 2013-03-15T17:03:36.040 回答
0

这可能不是最优雅的解决方案,但它肯定是有效的。

您可以通过在 php.ini 中设置包装脚本而不是 sendmail 来挂钩 PHP 邮件功能:

sendmail_path = /usr/local/bin/php_mail_wrapper

然后在脚本本身中,您可以执行以下操作:

#!/usr/bin/php
<?php

$sendmail_path = '/usr/sbin/sendmail';
$handle = fopen('php://stdin', 'r');
$mail = '';

while ($mail_line = fgets($handle)) {
    if (preg_match('/^X-PHP-Originating-Script:/i', $mail_line)) {
        continue;
    }
    $mail .= $mail_line;
}

$cmd = 'echo ' . escapeshellarg($mail) . ' | ' . $sendmail_path . ' -t -i';
return shell_exec($cmd);

?>

这个想法的功劳归于:How to hook PHP mail function

于 2019-02-08T22:01:56.960 回答