【问题标题】:Obfuscate X-Php-Originating-Script混淆 X-Php-Originating-Script
【发布时间】:2013-03-03 19:29:47
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

  • 我对你的问题投了反对票,因为我接受了错误的答案。请选择 Night Owl 的答案,以便阅读您的问题的人找到真正帮助他们的信息!
  • @Dominique 感谢您的提醒!

标签: php security email email-headers


【解决方案1】:

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

您可以通过在 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

【讨论】:

    【解决方案2】:

    根据 PHP 手册 (PHP Manual >> Function Reference >> Mail Related Extensions >> Mail >> Installing/Configuring),可以使用 php.ini.htaccess 文件关闭标头,这将防止任何人在您无法访问 php.ini 文件的情况下从您的邮件标头中收集信息。

    关闭它的设置是:

    mail.add_x_headerbool

    添加 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。

    【讨论】:

    • 这在 PHP 版本 5.3.10-1ubuntu3.11 中不起作用。太糟糕了。我在.htaccess 中尝试了mail.add_x_header 0mail.add_x_header Off。语法不同吗?
    • @SwissMister 语法是“php_flag mail.add_x_header Off”,理想情况下包裹在 ... 标签内。
    【解决方案3】:

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

    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 with Apache

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

    • FPM

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

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

    【讨论】:

    • 很好地指出源头,但忽略引用的代码块在 if (PG(mail_x_header)) 条件内是不好的,这使得 @NightOwl 的答案更加合理。
    • Night Owñ 的解决方案正在发挥作用,因此尽管 OP 选择了您的答案,但您在此处所说的内容并不准确。
    猜你喜欢
    • 1970-01-01
    • 2011-09-10
    • 2010-11-05
    • 2013-01-04
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多