[英]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身份验证。 假设您还没有这样做,一旦实施,您应该能够跟踪从特定域/电子邮件帐户发送的电子邮件数量并对其进行限制。
好的,请坚持下这个。 我没有实现它,但它看起来不错。
这里的概念就是你可以
您必须安装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.