当前位置: 首页 > 知识库问答 >
问题:

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

国盛
2023-03-14

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

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

然而,我们想阻止客户发送垃圾邮件,一旦他们在Y时间内发送超过X封电子邮件。

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

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

上面的选项仍然不会照顾垃圾邮件脚本使用常规telnet(telnetlocalhost,HELO,邮件从等)发送电子邮件时。

我向你们提出的问题是:我提到的这个想法是解决我们问题的最好、或许也是唯一的选择吗?还是有更好的解决方案?如果是这样,请解释一下你将如何处理这个问题。

共有3个答案

陆绍辉
2023-03-14

好的,在这件事上跟我说。我还没有实现它,但它看起来不错。

这里的概念是你可以

  1. 在客户网站的每个页面之前运行一个php文件
  2. 在该php文件中,将mail函数重命名为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;
}
岳永思
2023-03-14

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

薛英卫
2023-03-14

你可以在你的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()或其他方法。

 类似资料:
  • SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。 Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。 首先,我们来构造一个最简单的纯文本邮件: from email.mime.text import MIMEText msg = MIMEText('hello, send

  • SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。 Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。 首先,我们来构造一个最简单的纯文本邮件: from email.mime.text import MIMEText msg = MIMEText('hello, send

  • 你好;我正在使用s.o上给出的答案进行smtp邮件;(如果搜索,相信这是第一个结果) 但我仍然没有收到邮件;任何人都可以帮助发现任何错误或提供替代解决方案吗?我已经使用了内置的邮件程序,但它没有被认证,请参阅 -

  • 本文向大家介绍PHP实现SMTP邮件的发送实例,包括了PHP实现SMTP邮件的发送实例的使用技巧和注意事项,需要的朋友参考一下 当你还在纠结php内置的mail()函数不能发送邮件时,那么你现在很幸运,此时的这篇文章可以帮助到你! php利用smtp类来发邮件真是屡试不爽,我用过很久了,基本上没出过问题。本博客后台,当博主回复留言时候,会自动给网友发一封有新回复提示的邮件也是用的本文这个方法实现的