混淆X-Php-Originating-Script

时间:2013-03-15 06:47:50

标签: php security email email-headers

如果没有访问php.ini(假设php -v> = 5.3& mail.add_x_header = 1),或者修补邮件的方法,有没有办法改变X-Php-Originating-使用php的mail()函数时的脚本标题?

我做过的一项小小研究表明,在调用$_SERVER['PHP_SELF']之前更改mail()可以解决这个问题,但这对我没有用。

我还尝试直接设置X-Php-Originating-Script,这导致了另一个'X-Php-Originating-Script'标题。

此案例的目标是阻止所述电子邮件的收件人详细了解脚本命名法。

谢谢!

3 个答案:

答案 0 :(得分:8)

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

将其关闭的设置为:

  

mail.add_x_header bool

     

添加包含脚本UID的X-PHP-Originating-Script       通过文件名。

这会使实际的行禁用它:

 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。

答案 1 :(得分:4)

好吧,如果我们查看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基本上是与PHP通信的不同服务器API的多态方式。因此,如果我们看一些SAPI:

  • mod_php with Apache

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

  • FPM

    这甚至没有实现sapi_get_stat()。因此,默认行为仍在运行(这是当前路径的基本属性)。

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

答案 2 :(得分:0)

这可能不是最优雅的解决方案,但可以肯定地使用。

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

sendmail_path = /usr/local/bin/php_mail_wrapper

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

#!/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