繁体   English   中英

如何限制从PHP发送的出站SMTP邮件

[英]How to limit outbound SMTP mail sent from PHP

我们有共享托管服务器,它们使用PHP fastcgi(在IIS上)为多个客户端(共享托管)。 客户经常使用旧的可利用代码,这会导致其应用程序出现漏洞,最终被黑客用来安装恶意代码。 大多数情况下,此代码用于从我们的服务器发送垃圾邮件。

我们无法控制客户代码,因此修补漏洞是不可能的。

但是,我们希望阻止客户端在Y时间内发送超过X封电子邮件后发送垃圾邮件。

设置是基于fastcgi的,因此php和webserver之间几乎没有关系。 PHP通过localhost上的SMTP发送邮件。 邮件服务器允许中继所有localhost连接(显然)。

我想到的一件事是在fastcgi环境中设置一个包含标识符的环境变量,并使用php的prepend文件选项为php的邮件程序发送的所有邮件添加标题。 之后我们可以使用该邮件标题来识别垃圾邮件的罪魁祸首。

上面的选项在发送电子邮件时仍然不会使用常规telnet(telnet localhost,HELO,MAIL FROM等)来处理垃圾邮件脚本。

我的问题是:我是否提到了处理我们问题的最好也许唯一的选择? 或者有更好的解决方案吗? 如果是这样,请解释您将如何处理该问题。

您可以在MTA(邮件传输代理)上对其进行过滤。 例如,在Exim( http://www.exim.org )配置文件(/etc/exim/exim.conf)中,每个用户在1小时内允许不超过50封电子邮件:

begin acl

acl_check_not_smtp:
warn ratelimit = 0 / 1h / strict / $sender_address_local_part
log_message = Sender rate $sender_rate / $sender_rate_perio

acl_not_smtp = acl_not_smtp
begin acl
acl_not_smtp:
        deny message = Sender rate overlimit - $sender_rate / $sender_rate_period
        ratelimit = 50 / 1h / strict
        accept

无论他们如何尝试发送,通过php mail()或其他方法。

大多数共享主机阻止使用PHP的mail()函数,因为它可以很容易地被利用。 相反,他们建议使用sendmail或类似的脚本,在发送之前需要SMTP身份验证。 假设您还没有这样做,一旦实施,您应该能够跟踪从特定域/电子邮件帐户发送的电子邮件数量并对其进行限制。

好的,请坚持下这个。 我没有实现它,但它看起来不错。

这里的概念就是你可以

  1. 在客户网站上的每个页面之前运行一个php文件
  2. 在该php文件中将邮件功能重命名为mail_internal()。
  3. 在那个php中创建一个名为mail的新函数来进行检查/验证,允许客户发送邮件,如果他们使用相同的参数调用mail_internal()函数。

您必须安装runkit PECL扩展http://us.php.net/manual/en/runkit.installation.php

变化

在php.ini中

auto_prepend_file /var/www/allclients_forcedfile.php

在/var/www/allclients_forcedfile.php中

runkit_function_rename ( "mail" , "mail_internal" );
function mail (   $to ,   $subject ,   $message, $additional_headers = "",   $additional_parameters ="" )
{
     $args = func_get_args();
     error_log("mail_internal : $_SERVER[HTTP_HOST] : ".implode(" : ",$args));
     //lookup whether you want to send more mail for this client  maybe by keeping a counter in some file in the $SERVER[DOCUMENT_ROOT]
     if($sendmoremail)
            return mail_internal (   $args[0],   $args[1] ,   $args[2], $args[3]  ,   $args[4]   );
     return false;
}

正如预期的那样,Stack Overflow似乎不适合这个问题。 提供的答案没有公开一些明确的方法来识别FastCGI会话与MTA(SMTP)服务器的连接。

我将使用我在php环境中添加标识符的初始概念。 可以使用getenv()函数在PHP的前置文件中读取此标识符。 然后可以将此标识符添加到外发邮件的邮件头中。

此外,我启用了mail.add_x_header ini设置,这将有助于识别导致垃圾邮件运行的脚本。

我将这个问题留给赏金期限,希望其他选项会神奇地出现:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM