Как ограничить исходящую SMTP-почту, отправленную с PHP

У нас есть общие хостинговые серверы, которые используют PHP fastcgi (на IIS) для нескольких клиентов (общий хостинг). Регулярно клиенты используют старый эксплуатируемый код, который вызывает дыры в их приложениях, которые в конечном итоге используются хакерами для установки вредоносного кода. Большую часть времени этот код используется для рассылки спама с наших серверов.

мы не контролируем код наших клиентов, поэтому латать дыры совершенно невозможно.

однако мы хотели бы заблокировать клиентов отправка спама после отправки более X сообщений электронной почты за Y количество времени.

настройка основана на fastcgi, поэтому между php и веб-сервером мало связи. PHP отправляет свою почту через SMTP на localhost. Почтовый сервер позволяет ретрансляцию всех соединений localhost (очевидно).

одна вещь, которая проходит через мой ум, - это установка переменной среды, содержащей идентификатор в среде fastcgi, и использование опции файла prepend php для добавления заголовка ко всем почта отправляется почтой php. После этого мы могли бы использовать этот почтовый заголовок для идентификации виновника спама.

опция выше по-прежнему не будет заботиться о спам-скриптах с использованием обычного telnet (telnet localhost, HELO, MAIL FROM etc... ) при отправке электронной почты.

мой вопрос к вам: является ли идея, что я упомянул лучший и, возможно, единственный вариант решения нашей проблемы? Или есть лучшие решения для этой ситуации? И если да, пожалуйста, объясните, как вы справитесь с вопрос.

4 ответов


вы можете отфильтровать это на вас MTA (агент передачи сообщений). Например, разрешить не более 50 писем в 1 час для каждого пользователя в Exim (http://www.exim.org ) файл конфигурации (/etc/exim / exim.conf):

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() или другой метод.


большинство общих хостов блокируют использование функции mail () PHP, так как это можно легко использовать. Вместо этого они советуют использовать sendmail или аналогичные скрипты, которые требуют аутентификации SMTP перед отправкой. Предполагая, что вы еще не делаете этого, после реализации вы сможете отслеживать количество писем, отправленных с определенной учетной записи домена/электронной почты, и накладывать на нее ограничения.


хорошо, придерживайтесь меня на этом. Я не реализовал его, но он выглядит хорошо.

концепция здесь в том, что вы могли бы

  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

in/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;
}

как и ожидалось, переполнение стека не является правильным местом для этого вопроса. Предоставленные ответы не предоставляют какой-либо четкий метод для идентификации соединений сеансов FastCGI с сервером MTA (SMTP).

Я пойду с моей первоначальной концепцией добавления идентификатора в среду php. Этот идентификатор можно прочитать в PHP добавить файл с помощью getenv(). Затем этот идентификатор можно добавить в заголовки почты для исходящих сообщений почта.

кроме того, я включил mail.add_x_header настройка ini, которая поможет определить, какой скрипт вызвал запуск спама.

Я оставляю вопрос открытым для продолжительности баунти, надеясь, что другие варианты волшебным образом появятся:)