如果没有访问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'标题。
此案例的目标是阻止所述电子邮件的收件人详细了解脚本命名法。
谢谢!
答案 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。但是,让我们看看它带给我们的地方。
php_getuid()
只需在调用php_statpage()
php_statpage()
只是代理sapi_get_stat()
sapi_get_stat()
基本上代理了SAPI模块。现在,您应该了解SAPI基本上是与PHP通信的不同服务器API的多态方式。因此,如果我们看一些SAPI:
这只返回apache传递它的finfo
构造。没有机会修改它(它不是环境变量)。它直接来自apache。所以没有运气。
这甚至没有实现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